Wie Java-Thread-Dump zu tun

Dumps Java-Thread

In diesem Artikel werden wir versuchen, Java-Thread-Dumps zu verstehen, und wie können sie sehr mächtige Werkzeuge sein, um schnell zu verstehen und gemeinsame Probleme zu lösen. Dieser Artikel ist in 2 Teile geteilt. Der erste Teil konzentriert sich auf die folgenden grundlegenden Themen






  1. Kurze Einführung in Java-Threads
  2. Verstehen Sie, was sind Thread-Dumps
  3. Format des Gewindes Dumps
  4. Wie Thread-Dumps nehmen

Im Teil II werden wir lernen, sezieren und Thread-Dumps zu interpretieren, indem sie
  1. Verständnis Thread-Zustände
  2. Best Practices rund um die Analyse Dumps
  3. Die Analyse ein paar Rennbedingungen
  4. Ressourcen

Alle durch diesen Artikel des Thread-Dumps gezeigt ist aus dem wirklichen Leben Szenarien. Es wurden jedoch im Interesse der Raum nur Schnipsel gezeigt. Wir hoffen, dass die grundlegenden Konzepte noch leicht verstanden werden kann und einfach auf Ihre Situation angewendet.

Prozesse und Threads sind Grundbausteine ​​für die gleichzeitige Programmierung.

Themen sind manchmal leichte Prozesse genannt. Beide Prozesse und Threads bieten eine Ausführungsumgebung, sondern einen neuen Thread erfordert weniger Ressourcen zu schaffen, als einen neuen Prozess.

Themen gibt es innerhalb eines Prozesses - jeder Prozess hat mindestens eine. Themen teilen den Prozess des Ressourcen, einschließlich Speicher und Dateien öffnen. Dies sorgt für eine effiziente, aber potenziell problematisch, Kommunikation. Multithreaded Ausführung ist ein wesentliches Merkmal der Java-Plattform. Jede Anwendung hat mindestens einen Faden - oder mehr, wenn Sie „System“ Themen zählen die Dinge wie Speicherverwaltung und Signalverarbeitung zu tun. Aber aus der Sicht des Anwendungsprogrammierers, beginnen Sie mit nur einem Thread, der Haupt-Thread genannt. Dieser Thread hat die Fähigkeit, zusätzliche Threads zu erstellen, wie wir im nächsten Abschnitt zeigen werden. Die meisten Implementierungen der Java Virtual Machine als ein einziger Prozess ausgeführt werden.


Der Rest des Artikels vorausgesetzt, dass Sie grundlegendes Verständnis der Programmierung mit Threads auf Java haben. Wenn Sie Ihre Kenntnisse auffrischen möchten, würden wir empfehlen, Concurrency Kapitel aus dem Sun Java Tutorial. Sie könnten auch an den verschiedenen anderen Online-Ressourcen suchen.

Was sind Thread-Dumps

Lassen Sie uns, indem Sie auf einem Thread-Dump Thread-Dumps verstehen.

Vollständiges Thread-Dump Java HotSpot (TM) Client VM (1.5.0_04-b05 gemischter Modus, Sharing):

"DestroyJavaVM" Prio = 5 tid = 0x00036218 nid = 0xd68 unter der Bedingung in [0x00000000..0x0007fae8]

"Thread-1" Prio = 5 tid = 0x00ab8e68 nid = 0xe14 unter der Bedingung in [0x02d0f000..0x02d0fb68]
bei java.lang.Thread.sleep (native Methode)
bei org.tw.testyard.thread.Consumer.run (Consumer.java:18)
bei java.lang.Thread.run (Unknown Source)

"Thread-0" Prio = 5 tid = 0x00aa3ab8 nid = 0x1530 unter der Bedingung in [0x02ccf000..0x02ccfbe8]
bei java.lang.Thread.sleep (native Methode)
bei org.tw.testyard.thread.Producer.run (Producer.java:24)
bei java.lang.Thread.run (Unknown Source)

"Low Memory Detector" Daemon Prio = 5 tid = 0x00a6e950 nid = 0x1698 runnable [0x00000000..0x00000000]

"CompilerThread0" Daemon Prio = 10 tid = 0x00a6d658 nid = 0x5b8 unter der Bedingung in [0x00000000..0x02c0fa4c]

"Signal Dispatcher" Daemon Prio = 10 tid = 0x00a6c7c0 nid = 0x15e0 unter der Bedingung in [0x00000000..0x00000000]







"Finalizer" Daemon PRIO = 9 tid = 0x0003fb00 NID = 0x598 in Object.wait () [0x02b8f000..0x02b8fa68]
bei java.lang.Object.wait (native Methode)
- warten auf <0x22a80840> (A java.lang.ref.ReferenceQueue $ Lock)
bei java.lang.ref.ReferenceQueue.remove (Unknown Source)
- eingesperrt <0x22a80840> (A java.lang.ref.ReferenceQueue $ Lock)
bei java.lang.ref.ReferenceQueue.remove (Unknown Source)
bei java.lang.ref.Finalizer $ FinalizerThread.run (Unknown Source)

"Referenz-Handler" Daemon PRIO = 10 tid = 0x00a47aa0 NID = 0x1538 in Object.wait () [0x02b4f000..0x02b4fae8]
bei java.lang.Object.wait (native Methode)
- warten auf <0x22a80750> (A java.lang.ref.Reference $ Lock)
bei java.lang.Object.wait (Unknown Source)
bei java.lang.ref.Reference $ ReferenceHandler.run (Unknown Source)
- eingesperrt <0x22a80750> (A java.lang.ref.Reference $ Lock)

"VM Thread" Prio = 10 tid = 0x00a67ce8 nid = 0xc78 runnable

"VM Periodic Task-Thread" Prio = 10 tid = 0x00a6fc90 nid = 0x830 unter der Bedingung wartet


Wie der Name schon sagt Thread-Dump ist eine Müllkippe aller Threads in einer Java Virtual Machine. Es enthält den aktuellen Ausführungszustand von der Applikation als auch die JVM spezifischen Threads. Der obige Thread-Dump-Schnipsel zeigt zwei Anwendungs-Threads [Faden 0 und Thread-1] und JVM spezifische Themen wie „Signal Dispatcher“, „Finalizer“ usw. Für die Zwecke dieses Artikels werden wir nur auf Antrag Themen konzentrieren.

Thread-Dumps sind sehr nützlich in den folgenden Situationen
  • Um eine ganzheitliche Sicht von dem, was in der Anwendung in diesem Moment geschieht
  • Aufzudecken eklatante Probleme wie
    • Teile des Codes, die fast immer aufgerufen zu sein scheinen
    • Teile des Codes, wo die Anwendung zu sein scheint gehangen
    • Schließ- und Gewindesynchronisierungsprobleme in einer Anwendung,
  • Außerdem sind sie in Produktionsumgebungen von unschätzbarem Wert, wo anspruchsvolle Profilierwerkzeuge nicht leicht angebracht werden kann

Format des Gewindes Dumps

Das Format des Thread-Dump wird mit JSE Versionen sich verändert. Sun oder andere Anbieter informieren Benutzer, die das Format zwischen den Versionen ändern wird. Aber eine Sache, die nicht geändert hat, ist das Niveau der Informationen in einem Thread-Dump enthalten. Wie oben erwähnt Gewinde Deponien ist eine Momentaufnahme des Zustands JVM dem alle Anwendungs- und Systemebene Threads und Zustände überwachen.

Vollständiges Thread-Dump Java HotSpot (TM) Client VM (1.5.0_04-b05 gemischter Modus, Sharing):

"Thread-1" PRIO = 5 tid = 0x00a995d0 NID = 0x1300 in Object.wait () [0x02d0f000..0x02d0fb68]
bei java.lang.Object.wait (native Methode)
- warten auf <0x22aaa8d0> (A org.tw.testyard.thread.Drop)
bei java.lang.Object.wait (Unknown Source)
bei org.tw.testyard.thread.Drop.take (Drop.java:14)
- eingesperrt <0x22aaa8d0> (A org.tw.testyard.thread.Drop)
bei org.tw.testyard.thread.Consumer.run (Consumer.java:15)
bei java.lang.Thread.run (Unknown Source)

"Thread-0" Prio = 5 tid = 0x00a88440 nid = 0x6a4 unter der Bedingung in [0x02ccf000..0x02ccfbe8]
bei java.lang.Thread.sleep (native Methode)
bei org.tw.testyard.thread.Producer.run (Producer.java:24)
bei java.lang.Thread.run (Unknown Source)


Im Thread-Dump-Schnipsel oben können Sie folgendes beachten

  1. Die Thread-Dump beginnt mit „Full Thread-Dump“, gefolgt von einer Liste von Threads gerade ausgeführt wird.
  2. Es gibt 2 Anwendungs-Threads genannt Gewinde-1 und Gewinde 0. Dies sind die Standardnamen, die die JVM auf die Gewinde übergeben.
  3. „Thread-1“ für eine Benachrichtigung warten, nachdem es Object.wait () auf dem Drop-Objekt aufgerufen.
  4. In ähnlicher Weise „Thread-0“ auf einen Zustand schläft, nachdem es Thread.sleep genannt
  5. In diesem bestimmten Moment gibt es keine Themen in einem fahrtüchtigen Zustand und daher wird die Anwendung keine wirkliche Arbeit zu tun.

Obwohl Thread-Dumps listet auch den Status der System-Threads werden wir nicht tiefer Blick in System-Threads.

Wie Thread-Dumps nehmen

Thread-Dumps kann von den Benutzern sowie dem System in ungewöhnlichen Situationen erzeugt werden. Die Benutzer können Thread-Dumps erzeugen, indem sie explizit ein Signal an die JVM Senden oder programmatisch durch java.lang.Exception.printStackTrace () aufrufen. Aufrufe print () Methode wird nur die Stapelüberwachung des aktuellen Threads bewirken, gedruckt werden.

Obwohl sehr selten kann die JVM auch einen Thread-Dump erzeugen, wenn ein Thread die JVM zum Absturz bringt. Die Menge an Informationen, die protokolliert wird wieder Implementierung spezifisch. Typischerweise finden Sie Informationen über den Thread finden, die die JVM zum Absturz verursacht.

In diesem Abschnitt haben wir einen kurzen Blick auf Themen, Thread-Dump-Formate und wie Thread-Dumps zu nehmen. Der Spaß beginnt gerade. Im nächsten Abschnitt werden wir Thread-Zustände verstehen und wie Thread-Dumps zu interpretieren. Hier klicken, um zum nächsten Teil zu gehen







In Verbindung stehende Artikel