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
-XrsJVM-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.logWenn 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.logausgegeben. 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.exevon 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.