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
, wobei "user"der Benutzername des Benutzers ist, als den 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 die Variable installiert/verfügbar ist, wird empfohlen, die jstack -Tool. 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 die
-Xrs
jvm-Parameter ist aktiviert -
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 mithilfe von psexec tun, das Sie herunterladen können here. 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 ausführen Verwenden der Windows-Aufgabenplaner (als ein anderer Benutzer).
-
Wenn der Java-Prozess nicht reagiert, kann es manchmal hilfreich sein, die Option zu verwenden -J-d64 (auf 64-Bit-Systemen), zum Beispiel:
jstack -J-d64 -l <pid> >> threaddumps.log
-
Wenn der jstack-Befehl (
jstack -l <pid> >> threaddumps.log
) gibt den Fehler aus[
1]
unten und führen Sie dann 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 script (angepasst von der eclipse.org), die eine Reihe von Thread-Sicherheitskopien mit 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 wie viele Thread-Sicherheitskopien benötigt werden
- 3 ist die Verzögerung zwischen den einzelnen Ablagerungen
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 eine ähnliche Windows Powershell-Skript und ein Adobe AEM-spezifisches Skript auf github.
Alternative Möglichkeiten zum Abrufen eines Thread-Dump
Wenn die Variable jstack nicht verfügbar ist, können Sie Thread-Sicherheitskopien wie folgt erstellen:
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>
wobei "user"der Benutzer ist, als der Java-Prozess ausgeführt wird. -
Wenn Sie CQSE mit der
crx-quickstart/server/start
Skript verwenden, werden Ihre Thread-Sicherheitskopien incrx-quickstart/server/logs/startup.log
. 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 Folgendes aus:
javadump.exe <pid>
- Die Thread-Sicherheitskopie wird im
jvmoutput.log
-Datei, die in Schritt 2 erwähnt wird.
JDK 1.6
Abrufen einer Thread-Sicherheitskopie von jconsole mithilfe eines Plug-ins: [
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 die Thread Dump Analyzer-Dienstprogramm.
[
1]
- Ausführen
jconsole.exe
von JDK 1.6:jconsole.exe -pluginpath /path/to/file/tda.jar
- Klicken Sie auf Thread-Sicherheitskopien Registerkarte.
- Klicken Sie auf Thread-Sicherungskopie anfordern -Link.
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
um eine Thread-Liste zu erhalten. 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 Systemen.
[
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 die Dokumentation für den Support-Assistenten für Java für IBM.