2010-11-11 17 views
7

Potrzebuję sposobu na wyzwolenie pełnego GC ze skryptu konsoli linuksowej na ubuntu. Wiem, że to bardzo nieprzyjemna praktyka, ale bez wdawania się w zbyt wiele szczegółów, to sprawia, że ​​mój serwer działa. Jest to przeznaczone tylko na 1 lub 2 dni, podczas gdy ja naprawiam problem, więc nie muszę się budzić w nocy i wykonaj instrukcję GC przez jconsole lub jvisualvm.Sposób wyzwalania ręcznego Java GC z konsoli linux bez X11

Alternatywnie muszę wykonać skrypt myszy, który kliknie przycisk co 3-4 godziny, co jest jeszcze gorsze.

Proszę o pomoc.

Odpowiedz

11

Jeśli można mieć uruchomić aplikacji serwera JMX (co moim zdaniem jest implikowana z użytkowania JConsole/jvisualvm), to można powołać gc funkcjonowanie MBean za Memory pomocą narzędzi wiersza polecenia.

Po pierwsze potrzebujesz klienta JMX z wiersza poleceń. Używałem w przeszłości this one do prostych wywołań linii poleceń i działało dobrze. (Edycja: w rzeczywistości użyłem go, aby przetestować następujące polecenie, i pomyślnie wywołał GC w lokalnym procesie Tomcat).

Następnie należy opracować polecenie, aby uruchomić wyrzucanie śmieci. Myślę, że to powinno działać (będziesz oczywiście trzeba zmienić hosty/ports/poświadczenia jak właściwe):

java -jar cmdline-jmxclient-X.X.jar - localhost:8081 java.lang:type=Memory gc 

Wreszcie, można zaplanować wywołanie tego polecenia poprzez cron lub równoważne.

Voila!

+2

To zadziała. To trochę przerażające, że musisz to zrobić, ale zadziała. –

+0

+1 do tego komentarza, choć z pytania mam wrażenie, że Ævar jest już tego świadomy, i używa tej techniki jako poprawki tymczasowej. –

+0

Dziękuję bardzo, próbowałem i zadziałało, zaoszczędzę nocy, chociaż jestem bardzo blisko w naprawianiu faktycznego problemu. Aby trochę wyjaśnić problem, od jakiegoś czasu przestudiowałem ustawienia GC i zrobiłem wiele tuningu.Problem nie polega na tym, że JVM ma mało pamięci, a serwer działa poprawnie, ale przecieka gniazdami CLOSE_WAIT, które są oczyszczane podczas pełnego GC. Co jest również bardzo dziwne, to wypełnia pule połączeń i limity deskryptorów plików, a kończy się zawieszeniem serwera. –

-2

To nie jest zła praktyka, nie jest możliwe - nawet dla aplikacji Java wykonanej przez JVM. Dostępne jest wywołanie gc(), ale nawet jest to tylko wskazówka dla JVM do uruchomienia zbierania śmieci. Z konsoli zwykle nie ma możliwości wpływania na maszynę JVM podczas jej działania.

Niektóre zwróciła na to pytanie dla platformy Windows, patrz pytanie How to request JVM garbage collection (not from code) when run from Windows command-line

Możecie sprawdzić argumenty JVM na rozmiar stosu/sterty (zarówno minimalna i maksymalna). Istnieje wiele poprawek, które można wykonać w tym obszarze, ale są one w większości specyficzne dla używanej maszyny JVM.

JVM performance tuning for large applications

+0

to JVM-specyficzny. –

7

Jeśli masz Oracle JVM 1.7, możesz użyć jcmd, aby wyświetlić listę PIDów jvm, a następnie jcmd <pid> GC.run na GC.

jcmd <pid> help pokaże Ci, jakie inne polecenia są dostępne.

3
jcmd <pid> GC.run 

przykład:

jcmd 20350 GC.run 
Powiązane problemy