Ich verwende den kill -3
Befehl, um den Thread-Dump der JVM unter Unix anzuzeigen. Aber wo finde ich die Ausgabe dieses kill
Befehls? Ich bin verloren!!
Ich verwende den kill -3
Befehl, um den Thread-Dump der JVM unter Unix anzuzeigen. Aber wo finde ich die Ausgabe dieses kill
Befehls? Ich bin verloren!!
Antworten:
Alternativ können Sie jstack (im Lieferumfang von JDK enthalten) verwenden, um einen Thread-Dump zu erstellen und die Ausgabe zu schreiben, wo immer Sie möchten. Ist das in einer Unix-Umgebung nicht verfügbar?
jstack PID > outfile
Der Thread-Dump wird von der VM, auf der Sie den ausgeführt haben, in das System geschrieben kill -3
. Wenn Sie die Konsolenausgabe der JVM in eine Datei umleiten, befindet sich der Thread-Dump in dieser Datei. Wenn die JVM in einer offenen Konsole ausgeführt wird, wird der Thread-Dump in der Konsole angezeigt.
Es gibt eine Möglichkeit, die Ausgabe des JVM-Thread-Dumps beim Unterbrechungssignal in eine separate Datei mit der Diagnoseoption LogVMOutput umzuleiten :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Mit Java 8 im Bild jcmd
ist der bevorzugte Ansatz.
jcmd <PID> Thread.print
Es folgt der Ausschnitt aus der Oracle-Dokumentation :
Mit der Veröffentlichung von JDK 8 wurden Java Mission Control, Java Flight Recorder und das Dienstprogramm jcmd zur Diagnose von Problemen mit JVM- und Java-Anwendungen eingeführt. Es wird empfohlen, das neueste Dienstprogramm jcmd anstelle des vorherigen Dienstprogramms jstack zu verwenden, um die Diagnose zu verbessern und den Leistungsaufwand zu verringern.
Der Versand mit der Anwendung kann jedoch Auswirkungen auf die Lizenzierung haben, bei denen ich mir nicht sicher bin.
jcmd
keine Verbindung zum Windows-Dienst hergestellt werden, com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
solange dies jstack -F
erfolgreich ist: stackoverflow.com/questions/1197912/…
Bei Verwendung von kill -3 sollte der Thread-Dump in der Standardausgabe angezeigt werden. Die meisten Anwendungsserver schreiben die Standardausgabe in eine separate Datei. Sie sollten es dort finden, wenn Sie kill -3 verwenden. Es gibt mehrere Möglichkeiten, Thread-Dumps abzurufen:
kill -3 <PID>
: Gibt die Ausgabe an die Standardausgabe weiter.Für Hotspot-VMs können wir auch einen jstack
Befehl verwenden, um einen Thread-Dump zu generieren. Es ist ein Teil des JDK. Die Syntax lautet wie folgt:
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>
sollte die JVM nicht töten. Welche Art von Java-App suchen Sie?
Schritte, die Sie befolgen sollten, wenn Sie den Thread-Dump Ihres StandAlone Java-Prozesses möchten
Schritt 1: Rufen Sie die Prozess-ID für das Shell-Skript ab, das das Java-Programm aufruft
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
Schritt 2: Rufen Sie die Prozess-ID für das untergeordnete Element ab, das von runABCD aufgerufen wurde. Verwenden Sie die oben angegebene PID, um die Kinder zu erhalten.
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
Schritt 3: Holen Sie sich den JSTACK für den jeweiligen Prozess. Rufen Sie die Prozess-ID Ihres XYSServer-Prozesses ab. dh 8536
linux$ jstack **8536** > threadDump.log