Erstellen von Thread-Sicherungskopien von 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-Dumps aus einer JVM zu erstellen. Es wird dringend empfohlen, mehrere Thread-Dumps zu erstellen. Es empfiehlt sich, 10 Thread-Dumps in regelmäßigen Abständen zu erstellen (z. B. einen Thread-Dump alle zehn Sekunden).
 

Schritt 1: Rufen Sie die PID des Java-Prozesses ab

Um einen Thread-Dump erstellen zu können, benötigen Sie als Erstes die PID des Java-Prozesses.

Das Java-JDK wird mit dem jps-Befehl geliefert, 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 als sudo -u user jps -l ausführen, wobei „user“ der Name des Benutzers ist, unter dem der Java-Prozess ausgeführt wird.

Wenn dies nicht funktioniert oder Sie den Java-Prozess noch immer 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 suchen

Schritt 2: Fordern Sie einen Thread-Dump von der JVM an

jstack

Sofern installiert/verfügbar, empfehlen wir die Verwendung des Werkzeugs jstack. Damit werden Thread-Dumps an die Befehlszeilenkonsole ausgegeben.

Wenn Sie einen Thread-Dump mithilfe von jstack erhalten möchten, führen Sie den folgenden Befehl aus:
jstack -l <pid>

Sie können nachfolgende Thread-Dumps in eine Datei ausgeben, indem Sie die Anweisung zum Umleiten/Anhängen der Konsolenausgabe verwenden:
jstack -l <pid> >> threaddumps.log

Anmerkungen:

  • Das Werkzeug jstack 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 jvm-Parameter -Xrs aktiviert ist.
  • Mit dem jstack-Werkzeug von JDK 1.6 können Sie keine Thread-Dumps aus einem Prozess erstellen, der auf JDK 1.5 ausgeführt wird.
  • In Linux und UNIX müssen Sie den Befehl als Benutzer ausführen, der den Java-Prozess besitzt:
    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 „Für diesen Befehl ist nicht genügend Speicher verfügbar“ angezeigt wird, müssen Sie jstack als Windows-SYSTEM-Benutzer oder als Benutzer ausführen, der Eigentümer des Java-Prozesses ist.  Dies ist mit psexec möglich, 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 mit dem Windows-Aufgabenplaner (als ein 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, zum Beispiel:
    jstack -J-d64 -l <pid> >> threaddumps.log
    .
  • Wenn der Befehl „jstack“ (jstack -l <pid> >> threaddumps.log) den folgenden Fehler [1] ausgibt, führen Sie den Befehl als der Benutzer aus, der den Java-Prozess besitzt.  Zum Beispiel:
    sudo -u sling jstack -l <pid> >> threaddumps.log
[1] 
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 erfordert, mithilfe von „jstack“.  Es erfordert auch die CPU-Auslastung auf Threadebene, unter Benutzung eines obersten Befehls.

Führen Sie es einfach aus wie folgt:
sudo -u <user> jstackSeries.sh <pid> <aemserveruser> <count> <delay>

Zum 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 zu erstellenden Thread-Dumps
  • 3 ist die Verzögerung zwischen den einzelnen Dumps

Hinweis: Die Top-Ausgabe verfügt über die native Thread-ID im Dezimalformat, die jstack-Ausgabe hingegen die NID im Hexadezimalformat.  Sie können den hohen CPU-Thread von der Top- zur jstack-Ausgabe anpassen, indem Sie die Thread-ID in das Hexadezimalformat übertragen.

Zusätzlich zum obigen Skript haben wir auch ein ähnliches Windows Powershell-Skript und ein Adobe AEM-spezifisches Skript auf Github.

Thread Dump Tool für Adobe Experience Manager

Mit dem Adobe Experience Manager-Produkt können Sie dieses Werkzeug für eine einfache UI zur Erstellung von Thread-Dumps installieren.

Alternative Möglichkeiten zum Erstellen eines Thread-Dumps

Wenn das jstack-Werkzeug nicht für Sie verfügbar ist, können Sie Thread-Dumps wie folgt erstellen:

Hinweis: Einige Werkzeuge können keine Thread-Dumps aus der JVM erstellen, wenn der Befehlszeilenparameter -Xrs aktiviert ist. Wenn beim Erstellen von Thread-Dumps Probleme auftreten, sollten Sie prüfen, ob diese Option aktiviert ist.

UNIX, Mac OS X und Linux (JDK 1.4 oder frühere Version)

Unter UNIX, Mac OS X und Linux können Sie ein QUIT-Signal an den Java-Prozess senden, um einen Thread-Dump an die Standardausgabe auszugeben.

  1. Führen Sie dazu diesen Befehl aus:
    kill -QUIT <pid>
    Sie müssen diesen Befehl möglicherweise als sudo -u user kill -QUIT <pid> ausführen, wobei „Benutzer“ der Benutzer ist, unter dem der Java-Prozess ausgeführt wird.
  2. Wenn Sie CQSE mit dem Skript crx-quickstart/server/start starten, werden Thread-Dumps an crx-quickstart/server/logs/startup.log ausgegeben. Wenn Sie einen Drittanbieter-Anwendungsserver wie JBoss, WebSphere, Tomcat oder sonstige verwenden, finden Sie in der Dokumentation des Servers heraus, an welche Datei die Standardausgabe weitergeleitet wird.
Windows:
JDK 1.X
  1. Laden Sie javadump.exe herunter (unten angehängt).
  2. Starten Sie JVM mit diesen drei Argumenten (sie müssen in der richtigen Reihenfolge sein):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C:\temp\jvmoutput.log
  3. Drücken Sie Strg+Umschalt+Esc, um den Task-Manager zu öffnen.
  4. Suchen Sie die PID des Java-Prozesses.
  5. Führen Sie in der Befehlszeile
    javadump.exe <pid> aus
  6. Der Thread-Dump wird in der in Schritt 2 erwähnten Datei jvmoutput.log angezeigt.
JDK 1.6

Erstellen Sie einen Thread-Dump mit dem Werkzeug jconsole durch Verwendung eines Zusatzmoduls: [0]

Im Folgenden wird beschrieben, wie Sie einen Thread-Dump anfordern:

  1. Fügen Sie den folgenden Parameter zur JVM hinzu, auf der Communique ausgeführt wird: -Dcom.sun.management.jmxremote
  2. Laden Sie JDK 1.6 herunter und installieren Sie es (falls Sie dies noch nicht getan haben).
  3. Laden Sie das Dienstprogramm Thread Dump Analyzer herunter und extrahieren Sie es. [1]
  4. Führen Sie jconsole.exe von JDK 1.6 aus:
                                jconsole.exe -pluginpath /path/to/file/tda.jar
  5. Klicken Sie auf die Registerkarte Thread dumps.
  6. Klicken Sie auf den Link Request Thread Dump.

Hinweis: Wenn Sie AEM 6 verwenden.* und die laufenden Threads beobachten wollen, können Sie eine http://<host>:<port>/system/console/status-Threads Threadliste anfordern. Bitte beachten Sie jedoch, dass diese Thread-Dumps nicht mit Thread-Dump-Analysetools wie Samurai oder tda funktionieren.

Gilt für

Alle Adobe-Produkte, die in einer JVM ausgeführt werden

Tools zur Analyse von Thread-Dumps:

[0] https://docs.microsoft.com/de-de/sysinternals/downloads/psexec
[1] https://github.com/irockel/tda
[2] https://fastthread.io/
[3] https://www.ibm.com/support/knowledgecenter/en/SSLLVC_5.0.0/com.ibm.esupport.tool.tmda.doc/docs/readme.htm

Herunterladen

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie