Thread-Sicherheitskopien aus einer JVM erstellen
Ein Thread-Dump 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-Sicherheitskopien von einer JVM in Adobe Experience Manager erläutert.
Beschreibung description
Umgebung
Adobe Experience Manager
Problem/Symptome
Wie erhalte ich Thread-Sicherheitskopien von einer JVM unter Linux, UNIX oder Windows?
Ein Thread-Dump ist eine Liste aller Java-Threads, die derzeit in einer Java Virtual Machine (JVM) aktiv sind.
Es gibt mehrere Möglichkeiten, Thread-Sicherheitskopien von einer JVM zu erstellen. Es wird dringend empfohlen, mehr als 1 Thread-Dump zu nehmen. Es empfiehlt sich, 10 Thread-Sicherheitskopien in einem regelmäßigen Intervall zu erstellen (z. B. eine Thread-Sicherheitskopie alle zehn Sekunden).
Auflösung resolution
Schritt 1: PID Ihres Java-Prozesses abrufen
Die erste Information, die Sie benötigen, um einen Thread-Dump zu erhalten, ist die PID Ihres Java-Prozesses.
Das Java-JDK enthält den Befehl jps , 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 immer noch nicht finden können (Pfad nicht festgelegt, JDK nicht installiert oder ältere Java-Version), 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 einer Thread-Sicherheitskopie von JVM
jstack
Wenn es installiert/verfügbar ist, empfehlen wir die Verwendung des Tools jstack . Es werden Thread-Sicherheitskopien an die Befehlszeilenkonsole gedruckt.
Führen Sie den folgenden Befehl aus, um mithilfe von jstack eine Thread-Sicherheitskopie zu erhalten:jstack -l <pid>
Sie können aufeinander folgende Thread-Sicherheitskopien in einer Datei ausgeben, indem Sie die Umleitungs-/Anlagenrichtlinie für die Konsolenausgabe 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 dann, wenn der Parameter
-Xrs
jvm aktiviert ist -
Es ist nicht möglich, das jstack-Tool von JDK 1.6 zu verwenden, um Thread-Dumps aus einem Prozess zu nehmen, der auf JDK 1.5 ausgeführt wird.
-
Unter Linux und UNIX müssen Sie den Befehl als Benutzer ausführen, der Eigentümer des Java-Prozesses ist:
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 in Windows jstack ausführen und die Fehlermeldung "Für die Verarbeitung dieses Befehls ist nicht genügend Speicher verfügbar"erhalten, müssen Sie jstack als Windows SYSTEM-Benutzer oder den Benutzer ausführen, der Eigentümer des Java-Prozesses ist. Sie können dies mit psexec tun, das Sie hier herunterladen können. 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, können Sie eine .bat-Datei mit dem Befehl erstellen und diese mit unter Verwendung der Windows Task Scheduler (als anderer Benutzer) ausführen.
-
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 unten stehenden Fehler[
1]
ausgibt, führen Sie den Befehl als Benutzer aus, dem der Java-Prozess gehört. Beispiel: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 von dem auf eclipse.org), das eine Reihe von Thread-Sicherheitskopien mithilfe von jstack benötigt. Es nimmt auch die CPU-Nutzung auf Thread-Ebene mithilfe des obersten Befehls ein.
Führen Sie es einfach wie folgt aus:
sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>
Beispiel: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3
- 1234 ist die ID des Java-Prozesses
- cq5serveruser ist der Linux- oder UNIX-Benutzer, der als Java-Prozess ausgeführt wird
- 10 gibt an, wie viele Thread-Sicherheitskopien benötigt werden
- 3 ist die Verzögerung zwischen den einzelnen Dump
Hinweis: Die oberste Ausgabe hat die native Thread-ID im Dezimalformat, während die Jstack-Ausgabe die NID im Hexadezimalformat hat. Sie können den hohen CPU-Thread von der oberen Ausgabe zur jstack-Ausgabe abgleichen, indem Sie die Thread-ID in hexadezimal konvertieren.
Zusätzlich zum obigen Skript haben wir auch ein ähnliches Windows Powershell-Skript und ein Adobe AEM-spezifisches Skript auf github.
Alternative Möglichkeiten zum Abrufen eines Thread-Dump
Wenn das Tool jstack nicht verfügbar ist, können Sie Thread-Sicherheitskopien wie folgt durchführen:
Hinweis: Einige Tools können keine Thread-Sicherheitskopien von der JVM verwenden, wenn der Befehlszeilenparameter -Xrs
aktiviert ist. Wenn Sie Probleme beim Erstellen von Thread-Sicherheitskopien haben, überprüfen Sie, ob diese Option aktiviert ist.
UNIX, Mac OS X und Linux (JDK 1.4 oder weniger)
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 diesen Befehl aus:
kill -QUIT <pid>
Möglicherweise müssen Sie diesen Befehl als
sudo -u user kill -QUIT <pid>
ausführen, wobei "user"der Benutzer ist, als der der Java-Prozess ausgeführt wird. -
Wenn Sie CQSE mit dem
crx-quickstart/server/start
-Skript starten, werden Ihre Thread-Sicherheitskopien ancrx-quickstart/server/logs/startup.log
ausgegeben. Wenn Sie einen Drittanbieter-Anwendungsserver wie JBoss, WebSphere, Tomcat oder andere verwenden, finden Sie in der Serverdokumentation Informationen dazu, an welche Datei die Standardausgabe geleitet wird.
Windows:
JDK 1.X
- Laden Sie javadump.exe herunter (angehängt unten).
- Starten Sie die JVM mit diesen drei Argumenten (sie müssen in der richtigen Reihenfolge sein):
-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
javadump.exe <pid>
aus. - Die Thread-Sicherheitskopie wird in der in Schritt 2 erwähnten Datei
jvmoutput.log
angezeigt.
JDK 1.6
Rufen Sie eine Thread-Sicherheitskopie vom Tool jconsole ab, indem Sie ein Plug-in verwenden: [
0]
So können Sie eine Thread-Sicherheitskopie anfordern:
- Fügen Sie dem JVM, das Communique ausführt, den folgenden Parameter hinzu:
Dcom.sun.management.jmxremote
- Laden Sie JDK 1.6 herunter und installieren Sie es (falls noch nicht geschehen).
- Laden Sie das Thread Dump Analyzer-Dienstprogramm herunter und extrahieren Sie es.
[
1]
- Führen Sie
jconsole.exe
von JDK 1.6 aus:jconsole.exe -pluginpath /path/to/file/tda.jar
- Klicken Sie auf die Registerkarte Thread Dumps .
- Klicken Sie auf den Link Thread-Dump anfordern .
Hinweis: Wenn Sie AEM 6.x ausführen und die laufenden Threads beobachten möchten, können Sie http://<host>:<port>/system/console/status-Threads
anfordern, 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
Analyse-Tools für Thread-Sicherheitskopien
[
0]
PsExec v2.42 in der Microsoft-Dokumentation zu den Signalen.
[
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 for Java on IBM Support Assistant Documentation