Wie kann ich Thread-Dumps aus einer JVM unter UNIX oder Windows erstellen?

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.
  • 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> muss durch die Benutzer-ID ersetzt werden, unter der 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. Zur Ausführung von jstack als SYSTEM-Benutzer verwenden Sie einen Befehl wie diesen:
    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 dem Windows-Taskplaner (als anderer Benutzer) ausführen.
  • Manchmal ist es notwendig, die Option „-J-d64“ bei 64-Bit-Systemen hinzuzufügen, zum Beispiel:
    jstack -J-d64 -l <pid> >> threaddumps.log

jstack-Skript

Im Folgenden finden Sie ein Skript aus eclipse.org, das eine Reihe von Thread-Dumps mithilfe von jstack erstellt. Auch die CPU-Nutzung auf Thread-Ebene mit Top-Befehl ist erforderlich.

#!/bin/bash
if [ $# -eq 0 ]; then
    echo >&2 "Usage: jstackSeries <pid> <run_user> [ <count> [ <delay> ] ]"
    echo >&2 "    Defaults: count = 10, delay = 0.5 (seconds)"
    exit 1
fi
pid=$1          # required
user=$2         # required
count=${3:-10}  # defaults to 10 times
delay=${4:-0.5} # defaults to 0.5 seconds
while [ $count -gt 0 ]
do
    sudo -u $user top -H -b -n1 -p $pid >top.$pid.$(date +%H%M%S.%N) &
    sudo -u $user jstack -l $pid >jstack.$pid.$(date +%H%M%S.%N)
    sleep $delay
    let count--
    echo -n "."
done

 

Führen Sie es einfach wie folgt aus:
sh jstackSeries.sh [pid] [cq5serveruser] [count] [delay]

Beispiel:
sh jstackSeries.sh 1234 cq5serveruser 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.

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 den folgenden 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, 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 die JVM mit diesen drei Argumenten (sie müssen sich in der richtigen Reihenfolge befinden):
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=C: mpjvmoutput.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 die CQ5 oder CRX (mit Sling) ausführen und die aktiven Threads beobachten möchten, können Sie http://<Host>:<Port>/system/console/threads anfordern, um eine Thread-Liste zu erhalten. Beachten Sie jedoch, dass diese Thread-Dumps nicht mit Thread-Dump-Analysewerkzeugen wie samurai oder tda funktionieren.

Gilt für

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

[0] https://docs.microsoft.com/de-de/sysinternals/downloads/psexec
[1] https://github.com/irockel/tda
[2] http://docs.day.com/en/home/docutools/javadump_exe.html

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