Wie erstelle ich ein Java-Thread-Dump auf Linux
Umwelt
- Java
- Linux und die meisten Unix-ähnlichen Umgebungen
- Wie kann ich einen Thread-Dump in JBoss erzeugen, während unter Linux läuft?
- Wie erstelle ich einen JBoss-Stack-Trace auf Linux?
- Wie kann ich Ausgabe von kill umleiten -3 in eine Datei?
- JBoss hohe CPU-Auslastung hat, friert, hängt, oder entbindet nicht untätig Fäden, wie kann ich ein Thread-Dump zu beheben?
- JMS-Nachrichten verloren gehen, wie kann ich einen Thread-Dump erzeugen zu untersuchen?
- Nicht imstande, Thread-Dump zu nehmen mit kill -3 in server.log oder console.log
Lösung
Im Folgenden werden Methoden für ein Java-Thread-Dump auf Unix zu erzeugen:
1) Man beachte die Prozess-ID-Nummer des Java-Prozesses (zum Beispiel unter Verwendung von oben. Einen grep auf ps -axw. Etc.) und ein QUIT-Signal an den Prozess mit der Abtötungs -quit senden oder töten -3-Befehl. Beispielsweise:
2) Laden Sie entweder threaddump_linux.sh.tar.gz oder threaddump_solaris.sh.tar.gz. und extrahiert das Skript. Machen Sie das Skript executeable mit chmod 755
Es wird eine Reihe von 6-Thread-Dumps erfaßt Abstand von 20 Sekunden voneinander getrennt (je nach Bedarf modifizieren), in dem Java-Prozess-ID als Argument übergeben. Beispielsweise:
Achten Sie darauf, um das Skript zu testen, bevor das Problem sicher zu machen, geschieht es läuft richtig in Ihrer Umgebung.
3) Laden Sie entweder threaddump_linux-continuous.sh.tar.gz oder threaddump_solaris-continuous.sh.tar.gz. und extrahiert das Skript. Machen Sie das Skript executeable mit chmod 755
Es wird erfassen Gewinde Dumps 20 Sekunden voneinander beabstandet (modifiziert, wie erforderlich), in dem Java-Prozess-ID als Argument übergeben. Beispielsweise:
Achten Sie darauf, um das Skript zu testen, bevor das Problem sicher zu machen, geschieht es läuft richtig in Ihrer Umgebung.
4) Verwenden Sie den folgenden Befehl, um Ihre JBoss-Instanz zu starten und verwenden Sie dann töten -3 die threaddumps zu erzeugen.
Wenn die Java-Anwendung mit einem Service-Skript gestartet wird, die Ausgabe der Konsole anmeldet, wird der Thread-Dumps in dem Konsolenprotokoll sein. Andernfalls stdout in eine Datei beim Start umleiten.
Dies wird Ihre Ausgabe / threadump in die Datei Konsole angegeben in dem obigen Befehl umleiten.
4) OpenJDK / Sun JDK
Verwenden Sie JPS -lv die Java-Prozess-ID zu finden für die Ausgabe von Kill -quit oder töten -3.
Seien Sie die -Xrs JVM Option sicher nicht verwendet wird, da es SIGQUIT und SIGWAITING Signale ignoriert werden verursacht. Lauf Kill -3 sendet ein SIGQUIT Signal an die JVM, so mit dieser Option bewirkt, dass Kill -3 ignoriert werden. Siehe Java Application Launcher.
Bei der Verwendung von OpenJDK oder Sun JDK 1.6 oder höher, jstack verwendet, ist eine Option. Dies ist nützlich, wenn die Standardausgabe Umleiten auf eine Datei aus irgendeinem Grunde problematisch ist (zum Beispiel ist es nicht wünschenswert, die JVM neu zu starten, nur die Standardausgabe zu umleiten). Führen Sie die folgenden, in der ID-Java-Prozess übergeben:
5) Download 'linux_jstack-continuous.tar.gz', und das Skript extrahieren. Machen Sie das Skript executeable mit chmod 755
Es wird jstack verwenden, um eine Reihe von 6 Thema Dumps zu erfassen 20 Sekunden voneinander beabstandet (modifiziert, wie erforderlich), in dem Java-Prozess-ID als Argument übergeben. Stellen Sie sicher, dass Sie „JAVA_HOME“ in diesem Skript gesetzt. Es erzeugt eine Datei „jstack_threaddump.out“ im Verzeichnis genannt, wo dieses Skript ausgeführt wird. Beispielsweise:
- Stellen Sie sicher, dass der Java-Prozess noch mit dem PS-aux-Befehl (R oder S-Zustand in STAT Spalt) ausgeführt wird. Zum Beispiel jstack -F
setzt das Ziel Java-Prozess in einem "trace stop" (T) Zustand. Threads in dem (T) Zustand wird das Signal für einen Thread-Dump empfangen; Jedoch wird der Ausgang verzögert, bis der Prozess wird fortgesetzt. - Sie müssen sicherstellen, dass jstack Befehl aus dem gleichen Benutzer wie der Java-Prozess auszuführen. Bitte beachten Sie diesen Artikel für weitere Details.
- Es gibt bekannte Bugs mit anderen jstack Optionen bezogen (zB -F. -m. Usw.) und / oder Thread-Dump-Tools sind nicht in der Lage, die Ausgabe zu analysieren, so dass, wenn alle anderen Optionen außer -l vorgeschlagen werden, sollten Sie prüfen, Erfassung und die Ausgabe Parsen.
- Unter bestimmten Umständen läuft jstack möglicherweise Leistungseinbußen führen. Es wird berichtet, dass eine Verlangsamung der Reaktionszeit beobachtet werden kann, wenn jstack in einigen Szenarien ausgeführt wird.
- Wenn Sie Thread nehmen möchten Dumps zu identifizieren, welche Java-Threads hohe CPU verbrauchen, finden Sie unter Wie kann ich hohe CPU-Auslastung von Java-Threads unter Linux / Solaris und verwenden Sie das beiliegende Beispielskript in dem Artikel zu identifizieren.
JBoss EAP 5.x
Um stdout in eine Datei beim Start zu umleiten:
Wenn Probleme mit stdout umgeleitet wird. $ JBOSS_HOME / bin / run.sh ändern und ändern Sie die Zeile:
Speichern und starten Sie JBoss normal. Jetzt töten -3 oder töten -quit sollte einen Thread-Dump in der Datei console.log erstellen.
JBoss EAP 6.x
Die Empfehlung ist jstack zu verwenden.
JBoss Sicherung 6
Thread-Dumps von einem untergeordneten Container Wenn Sie erfassen, beachten Sie, dass der Prozess zu dem Stammcontainer unterscheidet. Achten Sie darauf, die Prozess-ID (PID) mit ‚PS‘ oder ähnlich, bevor der Auswahl der PID zu prüfen, um das Skript auszuführen gegen. z.B: