Używam kill -3
polecenia, aby zobaczyć zrzut wątku maszyny JVM w systemie UNIX. Ale gdzie mogę znaleźć dane wyjściowe tego kill
polecenia? Zgubiłem się!!
Używam kill -3
polecenia, aby zobaczyć zrzut wątku maszyny JVM w systemie UNIX. Ale gdzie mogę znaleźć dane wyjściowe tego kill
polecenia? Zgubiłem się!!
Odpowiedzi:
Możesz alternatywnie użyć jstack (dołączony do JDK), aby wykonać zrzut wątku i zapisać wynik w dowolnym miejscu. Czy to nie jest dostępne w środowisku uniksowym?
jstack PID > outfile
Zrzut wątku jest zapisywany w systemie z maszyny wirtualnej, na której wykonano plik kill -3
. Jeśli przekierowujesz dane wyjściowe konsoli JVM do pliku, zrzut wątku będzie znajdował się w tym pliku. Jeśli maszyna JVM działa w otwartej konsoli, zrzut wątku zostanie wyświetlony w jej konsoli.
Istnieje sposób na przekierowanie wyjścia zrzutu wątku JVM w przypadku sygnału przerwania do oddzielnego pliku z opcją diagnostyczną LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
jcmd
Preferowanym podejściem jest Java 8 na ilustracji .
jcmd <PID> Thread.print
Poniżej znajduje się fragment z dokumentacji Oracle :
Wydanie JDK 8 wprowadziło Java Mission Control, Java Flight Recorder i narzędzie jcmd do diagnozowania problemów z aplikacjami JVM i Java. Zaleca się użycie najnowszego narzędzia jcmd zamiast poprzedniego narzędzia jstack w celu ulepszenia diagnostyki i zmniejszenia narzutu wydajności.
Jednak wysyłanie tego z aplikacją może mieć konsekwencje licencyjne, których nie jestem pewien.
jcmd
nie udaje się połączyć z procesem obsługi systemu Windows, com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
podczas gdy się jstack -F
udaje: stackoverflow.com/questions/1197912/ ...
Używając kill -3, powinieneś zobaczyć zrzut wątku na standardowym wyjściu. Większość serwerów aplikacji zapisuje standardowe wyjście w oddzielnym pliku. Powinieneś go tam znaleźć, używając kill -3. Istnieje wiele sposobów uzyskiwania zrzutów wątków:
kill -3 <PID>
: Daje wyjście na standardowe wyjście.W przypadku maszyn wirtualnych typu hotspot możemy również użyć jstack
polecenia do wygenerowania zrzutu wątku. To część JDK. Składnia jest następująca:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
powinno zabijać JVM. Jakiego typu aplikacji Java szukasz?
Kroki, które należy wykonać, aby wykonać zrzut wątku samodzielnego procesu Java
Krok 1: Uzyskaj identyfikator procesu dla skryptu powłoki wywołującego program java
linux$ ps -aef | grep "runABCD"
user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD
Krok 2: Uzyskaj identyfikator procesu dla dziecka, które zostało wywołane przez runABCD. Użyj powyższego PID, aby uzyskać childs.
linux$ ps -aef | grep **8535**
user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer
user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh
user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535
Krok 3: Pobierz JSTACK dla konkretnego procesu. Uzyskaj identyfikator procesu swojego procesu XYSServer. tj. 8536
linux$ jstack **8536** > threadDump.log