Erstellen von Thread-Dumps von einer JVM
Ein Thread-Speicherauszug ist eine Liste aller Java-Threads, die derzeit in einer Java Virtual Machine (JVM) aktiv sind. In diesem Artikel werden die verschiedenen Möglichkeiten zum Abrufen von Thread-Dumps von einer JVM in Adobe Experience Manager erläutert.
Beschreibung description
Umgebung
Adobe Experience Manager
Problem/Symptome
Wie erhalte ich Thread-Dumps von einer JVM unter Linux, UNIX oder Windows?
Ein Thread-Speicherauszug ist eine Liste aller Java-Threads, die derzeit in einer Java Virtual Machine (JVM) aktiv sind.
Es gibt mehrere Möglichkeiten, Thread-Speicherauszüge von einer JVM zu übernehmen. Es wird dringend empfohlen, mehr als einen Thread-Speicherauszug zu erstellen. Es empfiehlt sich, in regelmäßigen Abständen 10 Thread-Dumps zu erstellen (z. B. alle zehn Sekunden einen Thread-Dump).
Auflösung resolution
Schritt 1: Abrufen der PID Ihres Java-Prozesses
Die erste Information, die Sie benötigen, um einen Thread-Dump zu erhalten, ist die PID Ihres Java-Prozesses.
Das Java-JDK wird mit dem Befehl jps ausgeliefert, der alle Java-Prozess-IDs auflistet. Sie können diesen Befehl wie folgt ausführen:
jps -l 70660 sun.tools.jps.Jps 70305
Hinweis: Unter Linux und UNIX müssen Sie diesen Befehl möglicherweise als sudo -u user jps -l
ausführen, wobei „user“ der Benutzername des Benutzers ist, unter dem der Java-Prozess ausgeführt wird.
Wenn dies nicht funktioniert oder Sie Ihren Java-Prozess (Pfad nicht festgelegt, JDK nicht installiert oder ältere Java-Version) immer noch nicht finden können, verwenden Sie
- UNIX, Linux und Mac OS X:
ps -el | grep java
- Windows: Drücken Sie Strg+Umschalt+Esc, um den Task-Manager zu öffnen und die PID des Java-Prozesses zu finden
Schritt 2: Anfordern eines Thread-Speicherauszugs von der JVM
jstack
Sofern installiert/verfügbar, empfehlen wir die Verwendung des jstack-Tools. Dadurch werden Thread-Speicherauszüge auf der Befehlszeilenkonsole gedruckt.
Um einen Thread-Dump mit jstack zu erhalten, führen Sie den folgenden Befehl aus:jstack -l <pid>
Sie können mehrere aufeinander folgende Thread-Speicherauszüge in eine Datei ausgeben, indem Sie die -Direktive für die Konsolenausgabe „umleiten/anhängen“ verwenden:jstack -l <pid> >> threaddumps.log
Hinweise:
-
Das jstack-Tool ist seit JDK 1.5 verfügbar (für JVM unter Windows ist es nur in einigen Versionen von JDK 1.5 und JDK 1.6 verfügbar).
-
JStack funktioniert auch, wenn der
-Xrs
JVM-Parameter aktiviert ist -
Es ist nicht möglich, das jstack-Tool von JDK 1.6 zu verwenden, um Thread-Dumps aus einem auf JDK 1.5 ausgeführten Prozess zu erstellen.
-
Unter Linux und UNIX müssen Sie den Befehl als den Benutzer ausführen, dem der Java-Prozess gehört:
sudo -u java-user jstack -l <pid>
(
<
java-user>
sollte durch die ID des Benutzers ersetzt werden, unter dem der Java-Prozess ausgeführt wird) -
Wenn Sie unter Windows jstack ausführen und die Fehlermeldung „Nicht genügend Speicher ist verfügbar, um diesen Befehl zu verarbeiten“ erhalten, müssen Sie jstack als den Windows SYSTEM-Benutzer oder den Benutzer ausführen, dem der Java-Prozess gehört. Sie können dies tun, indem Sie psexec verwenden, die Sie herunterladen können hier. Um jstack als SYSTEM-Benutzer auszuführen, verwenden Sie einen Befehl wie den folgenden:
psexec -s jstack <pid> >> threaddumps.log
Wenn Sie psexec nicht auf dem Server installieren können, dann können Sie eine .bat-Datei mit dem Befehl erstellen und ihn ausführen ( der Windows-Taskplanung als anderer Benutzer).
-
Wenn der Java-Prozess nicht reagiert, kann es manchmal hilfreich sein, die Option -J-D64 (auf 64-Bit-Systemen) zu verwenden, z. B.:
jstack -J-d64 -l <pid> >> threaddumps.log
-
Wenn der jstack-Befehl (
jstack -l <pid> >> threaddumps.log
) den Fehler[
1]
unten ausgibt, führen Sie den Befehl als der Benutzer aus, dem der Java-Prozess gehört. z. B.:sudo -u sling jstack -l <pid> >> threaddumps.log
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
JSTACK-SKRIPT
Hier ist ein Skript (angepasst an das Skript auf eclipse.org), das eine Reihe von Thread-Dumps mit jstack durchführt. Außerdem wird die CPU-Auslastung auf Thread-Ebene mit dem Befehl „top“ benötigt.
Führen Sie es einfach so aus:
sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>
Beispiel: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3
- 1234 ist die PID des Java-Prozesses
- cq5serveruser ist der Linux- oder UNIX-Benutzer, unter dem der Java-Prozess ausgeführt wird
- 10 ist die Anzahl der Thread-Dumps, die ausgeführt werden sollen
- 3 ist die Verzögerung zwischen den einzelnen Dumps
Hinweis: Die obere Ausgabe hat die native Thread-ID im Dezimalformat, während die jstack-Ausgabe die NID im Hexadezimalformat hat. Sie können den High-CPU-Thread von der oberen Ausgabe in die jstack-Ausgabe umwandeln, indem Sie die Thread-ID in einen Hexadezimalwert konvertieren.
Zusätzlich zum obigen Skript verfügen wir auch über ein ähnliches Windows PowerShell-Skript und ein Adobe-AEM-spezifisches Skript auf GitHub.
Alternative Möglichkeiten zum Abrufen eines Thread-Speicherauszugs
Wenn Ihnen das jstack-Tool nicht zur Verfügung steht, können Sie Thread-Dumps wie folgt erstellen:
Hinweis: Einige Tools können keine Thread-Dumps von JVM erstellen, wenn der Befehlszeilenparameter "-Xrs
" aktiviert ist. Wenn Sie Probleme mit Thread-Dumps haben, überprüfen Sie, ob diese Option aktiviert ist.
UNIX, Mac OS X und Linux (JDK 1.4 oder niedriger)
Unter UNIX, Mac OS X und Linux können Sie ein QUIT-Signal an den Java-Prozess senden, um ihn anzuweisen, einen Thread-Dump an die Standardausgabe auszugeben.
-
Führen Sie dazu den folgenden Befehl aus:
kill -QUIT <pid>
Möglicherweise müssen Sie diesen Befehl ausführen,
sudo -u user kill -QUIT <pid>
„user“ der Benutzer ist, unter dem der Java-Prozess ausgeführt wird. -
Wenn Sie CQSE mit dem
crx-quickstart/server/start
-Skript starten, werden Ihre Thread-Dumps ancrx-quickstart/server/logs/startup.log
ausgegeben. Wenn Sie einen Anwendungsserver eines Drittanbieters wie JBoss, WebSphere, Tomcat oder einen anderen verwenden, lesen Sie die Dokumentation des Servers, um herauszufinden, an welche Datei die Standardausgabe geleitet wird.
Windows:
JDK 1.X
- Laden Sie javadump.exe (unten angehängt) herunter.
- Starten Sie JVM mit diesen drei Argumenten (sie müssen in der richtigen Reihenfolge vorliegen):
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
- Drücken Sie Strg+Umschalt+Esc, um den Task-Manager zu öffnen.
- Suchen Sie die PID des Java-Prozesses.
- Führen Sie in der Befehlszeile aus:
javadump.exe <pid>
- Der Thread-Speicherauszug wird in der in Schritt 2 erwähnten
jvmoutput.log
-Datei angezeigt.
JDK 1.6
Abrufen eines Thread-Speicherauszugs vom jconsole-Tool mithilfe eines Plug-ins: [
0]
So können Sie einen Thread-Speicherauszug anfordern:
- Fügen Sie den folgenden Parameter zur JVM hinzu, die Communique ausführt:
Dcom.sun.management.jmxremote
- Laden Sie JDK 1.6 herunter und installieren Sie es (falls noch nicht geschehen).
- Laden Sie das Dienstprogramm Thread Dump Analyzer“ herunter und extrahieren Sie.
[
1]
- Führen Sie
jconsole.exe
von JDK 1.6 aus:jconsole.exe -pluginpath /path/to/file/tda.jar
- Klicken Sie auf Registerkarte Thread-Dumps“.
- Klicken Sie auf den Anfrage-Thread-Dump-Link.
Hinweis: Wenn Sie AEM 6.x ausführen und die ausgeführten Threads beobachten möchten, können Sie http://<host>:<port>/system/console/status-Threads
auffordern, eine Thread-Liste abzurufen. Beachten Sie jedoch, dass diese Thread-Dumps nicht mit Thread-Dump-Analyse-Tools wie Samurai oder tda funktionieren.
Gilt für:
Alle Adobe-Produkte, die in einer JVM ausgeführt werden
Thread-Dump-Analyse-Tools
[
0]
PsExec v2.42 in der Dokumentation zu Sysinternals in Microsoft.
[
1]
TDA - Thread Dump Analyzer auf irockel/tda auf Github.com.
[
2]
Java Thread Dump Analyzer auf FastThread.
[
3]
IBM Thread and Monitor Dump Analyzer für Java im IBM Support Assistant Dokumentation.