Thread-Dumps in Java

Ein Thread-Dump ist eine Sammlung aktiver Threads, die auf der JVM ausgeführt werden. Mit anderen Worten: Es handelt sich um eine Momentaufnahme des aktuellen Status aller Java-Threads, die auf der JVM ausgeführt werden. Die Threads können entweder von Ihrer eigenen Anwendung aufgerufen werden oder von der JVM selbst verwaltet werden. Allerdings werden alle Threads erfasst und gespeichert, wenn Sie JVM anweisen, die Threads abzurufen Thread-Dump.

Thread-Dumps sind sehr hilfreich, wenn bei Ihrer Anwendung Leistungsprobleme auftreten Thread-Dumpskönnen Sie analysieren, ob zwischen zwei Threads ein Deadlock vorliegt oder nicht genügend Speicher für die Ausführung aller Threads vorhanden ist. Deadlocks führen dazu, dass eine Anwendung teilweise oder vollständig zum Stillstand kommt.

Es ist sehr einfach, die Thread-Dumps von der laufenden JVM zu übernehmen. Es gibt mehrere Möglichkeiten, den Thread-Dump von JVM zu übernehmen. Es wird dringend empfohlen, mehr als einen Thread-Dump zu erstellen. Eine gute Vorgehensweise besteht darin, in regelmäßigen Abständen 5 bis 10 Thread-Dumps zu erstellen (z. B. 1 Thread-Dump alle 10 Sekunden). Dies liegt daran, dass Sie durch die Erstellung mehrerer Thread-Dumps den unterschiedlichen Status jedes Threads für eine bestimmte Dauer sehen und mehr über die Aktivitäten jedes Threads erfahren können.

Java-Thread-Dumps

Wie erstelle ich Thread-Dumps in Windows?

Wenn Sie Ihren Server unter Windows ausführen, verwenden Sie den folgenden Befehl, um die Thread-Dumps zu erstellen:

CTRL + BREAK (or)
CTRL + Fn + PAUSE (or)
CTRL + ALT + ESC

Manchmal finden Sie in Ihrem System möglicherweise nicht die richtigen Tasten, um den Befehl auszulösen. Deshalb habe ich einige der möglichen Tastenkombinationen aufgelistet, die zum Erstellen der Thread-Dumps im Windows-Betriebssystem verwendet werden.

Wenn Sie versuchen, den Thread-Dump vom Tomcat-Server abzurufen, während dieser an der Eingabeaufforderung ausgeführt wird, drücken Sie direkt die oben genannten Tasten in der Eingabeaufforderung, um die Details der Thread-Dumps anzuzeigen. Sie müssen lediglich die Informationen kopieren und zur weiteren Analyse in ein Textdokument einfügen. Der Prozess zum Erstellen der Thread-Dumps kann für jeden Server unterschiedlich sein.

Hier ist ein Beispiel für Thread-Dumps, die ich vom Tomcat-Server übernommen habe:

- locked <0x29a002f8> (a [Lorg.apache.catalina.Service;)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
- locked <0x29907fb0> (a org.apache.catalina.core.StandardServer)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
"VM Thread" prio=10 tid=0x01927000 nid=0x32cc runnable
"VM Periodic Task Thread" prio=10 tid=0x0194ec00 nid=0x20e4 waiting on condition
JNI global references: 170
Heap
 def new generation   total 9792K, used 8850K [0x242f0000, 0x24d80000, 0x2984000
0)
  eden space 8768K,  89% used [0x242f0000, 0x24aa1ff8, 0x24b80000)
  from space 1024K,  94% used [0x24b80000, 0x24c72b20, 0x24c80000)
  to   space 1024K,   0% used [0x24c80000, 0x24c80000, 0x24d80000)
 tenured generation   total 21588K, used 13680K [0x29840000, 0x2ad55000, 0x342f0
000)
   the space 21588K,  63% used [0x29840000, 0x2a59c128, 0x2a59c200, 0x2ad55000)
 compacting perm gen  total 12288K, used 5865K [0x342f0000, 0x34ef0000, 0x382f00
00)
   the space 12288K,  47% used [0x342f0000, 0x348aa410, 0x348aa600, 0x34ef0000)
    ro space 10240K,  45% used [0x382f0000, 0x38771888, 0x38771a00, 0x38cf0000)
    rw space 12288K,  54% used [0x38cf0000, 0x393704f8, 0x39370600, 0x398f0000)
Feb 16, 2016 5:04:10 PM org.apache.catalina.util.SessionIdGenerator createSecure
Random
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRN
G] took [185] milliseconds.
Feb 16, 2016 5:04:11 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive 

Thread-Dumps in Tomcat

Wie erstelle ich Thread-Dumps unter Unix/Linux?

Führen Sie den folgenden Befehl aus, um den Thread-Dump auf Unix- oder Linux-Maschinen zu erstellen:

Kill –3 process_id

Sie können den folgenden Befehl verwenden, um die Prozess-ID für Java abzurufen:

ps -ef | grep java

Wenn Sie den obigen Befehl ausführen, wird der Thread-Dump dorthin gesendet, wo auch immer die Standardausgabe umgeleitet wird.
(Im Tomcat-Server wird der Thread-Dump standardmäßig an TOMCAT_HOME/logs/Catalina.out gesendet.) Das Befehlssignal QUIT bricht den Java-Prozess nicht wirklich ab. Der Thread-Dump wird an die Standardausgabe gesendet und der Prozess läuft weiter.

Wie funktioniert die Thread-Dump-Anfrage intern?

Wenn Sie den Befehl aufrufen, um die JVM aufzufordern, den Thread-Dump zu senden, werden in der JVM die folgenden Schritte ausgeführt:

  • Der Java-Prozess wird angehalten und alle aktuell laufenden Threads werden sofort angehalten.
  • Der Haupt-Java-Thread fordert alle Threads auf, Einzelheiten darüber anzugeben, was sie gerade tun.
  • Der Thread-Dump wird an die Standardausgabe gesendet, entweder als Protokolldatei oder als Konsole zum Drucken der Details.
  • Der Java-Prozess setzt den Job fort und alle Threads nehmen ihre Arbeit wieder auf.
  • Diese Aufgabe dauert nur wenige Sekunden und wird dann dort fortgesetzt, wo sie aufgehört hat.
  • Ich hoffe, dieses Tutorial hat Ihnen geholfen, die Thread-Dumps in Java zu verstehen und zu erfahren, wie Sie sie mithilfe von Befehlen in den Betriebssystemen Windows/Unix/Linux abrufen können. Wenn Sie Fragen haben, schreiben Sie diese bitte in den Kommentarbereich.

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    Nach oben scrollen