In diesem Artikel werde ich Ihnen beibringen, wie Sie den Thread -Stapel von JVM analysieren und wie Sie die Hauptursache des Problems aus den Stapelinformationen finden. Meiner Meinung nach ist die Thread -Stack -Analyse -Technologie eine Technologie, die Java EE -Produkte unterstützen, die Ingenieure beherrschen müssen. Die im Thread Stapel gespeicherten Informationen sind normalerweise weit über Ihre Fantasie hinaus.
Mein Ziel ist es, das Wissen und die Erfahrung in den letzten zehn Jahren in der Fadenanalyse zu teilen. Diese Kenntnisse und Erfahrungen werden in der In -TEPTH -Analyse verschiedener Versionen von JVM und der JVM -Lieferanten verschiedener Hersteller erzielt.
Also, sind Sie bereit, jetzt wird dieser Artikel dem Lesezeichen hinzugefügt. Worauf warten Sie noch, beeilen Sie sich bitte und teilen Sie diesen Thread -Analyse -Trainingsplan mit Ihren Kollegen und Freunden.
Es klingt gut.
Mein Vorschlag ist, mir zu folgen, um diesen Thread -Analyse -Trainingsplan abzuschließen. Hier sind die Schulungsinhalte, die wir abdecken werden. Gleichzeitig werde ich Ihnen die tatsächlichen Fälle mitteilen, mit denen ich mit allen gelernt und verstehen kann.
1) Überblick über Thread -Stapel und Grundkenntnisse
2) Prinzipien und verwandte Werkzeuge von Thread Stapel
3) Unterschiedliche JVM -Thread -Stapelformate (Sun Hotspot, IBM Jre, Oracal Jrockit)
4) Einführung und Analysemethode des Thread -Stapel -Protokolls
5) Analyse von Thread -Stapeln und verwandten Technologien
6) Häufige Problemvorlagen (Threading, tote Schlösser, Todesfall, Müllrecycling/OutofMemoryError -Problem, toter Zyklus usw.)
7) Zum Beispiel Analyse von Thread -Stapel -Problemen
Ich hoffe, diese Trainingsreihe bringt Ihnen echte Hilfe. Bitte achten Sie weiterhin auf das wöchentliche Artikel -Update.
Aber was soll ich tun, wenn ich Fragen im Studienprozess habe oder den Inhalt im Artikel nicht verstehen kann?
Mach dir keine Sorgen, behandle mich einfach als deinen Mentor. Sie können mich mit Fragen zum Thread -Stapel konsultieren (vorausgesetzt, das Problem kann nicht zu niedrig sein). Bitte wählen Sie die folgenden Möglichkeiten, um mit mir in Kontakt zu treten:
1) In diesem Artikel direkt kommentiert (wenn Sie sich entschuldigen, können Sie anonym sein)
2) Senden Sie Ihre Thread -Stapeldaten in das Forum für Ursachenanalyseanalyse
3) Senden Sie mir eine E -Mail, die Adresse lautet@[email protected]
Können Sie mir helfen, die Probleme unserer Produkte zu analysieren?
Wenn Sie bereit sind, können Sie mir natürlich Ihre Stapel -Live -Daten per E -Mail oder Forum Root CAPES -Analyse -Forum senden. Das tatsächliche Problem ist der König des Lernens, um die Fähigkeiten zu verbessern.
Ich hoffe wirklich, dass diesem Training an jedem gefallen kann. Daher werde ich mein Bestes tun, um Ihnen Materialien mit hoher Qualität zu geben und Ihre verschiedenen Fragen zu beantworten.
Bevor Sie die Thread -Stack -Analyse -Technologie und das Problemmodell einführen, müssen Sie Ihnen zunächst den grundlegenden Inhalt mitteilen. In diesem Beitrag werde ich also die grundlegendsten Inhalte abdecken, damit jeder die Interaktion zwischen JVM, Middleware und Java EE -Containern besser verstehen kann.
Java VM -Übersicht
Java Virtual Machine ist die Grundlage der Jave EE -Plattform. Es ist der Ort, an dem Middleware und Anwendungen bereitgestellt und ausgeführt werden.
JVM bietet der Middleware -Software und Ihrem Java/Java EE -Programm die folgenden Dinge an:
(Binärform) Java / Java EE -Programm Ausführende Umgebung Einige Programmfunktionsmerkmale und -instrumente (IO -Infrastruktur, Datenstruktur, Thread -Management, Sicherheit, Überwachung usw.).).)
Dynamische Speicherzuweisung und -verwaltung mit Hilfe der Müllwiederherstellung
Ihr JVM kann auf vielen Betriebssystemen (Solaris, AIX, Windows usw.) bleiben und können nach Ihrem physischen Server konfiguriert werden.
Interaktion zwischen JVM und Middleware
Das folgende Diagramm zeigt das interaktive hohe Modell zwischen JVM, Middleware und Anwendungen.
Einige einfache und typische Interaktionen zwischen JVM, Middleware und Apps, die in der Abbildung angezeigt werden. Wie Sie sehen können, wird die Zuweisung der Threads der Standard -Java -EE -Anwendung zwischen dem Kern des mittleren Teils und dem JVM abgeschlossen. (Natürlich gibt es Ausnahmen. Die Anwendung kann die API direkt aufrufen, um einen Thread zu erstellen. Dieser Ansatz ist nicht üblich, und es ist erforderlich, während der Verwendung vorsichtig zu sein.)
Beachten Sie gleichzeitig, dass einige Threads von JVM verwaltet werden.
Da die meisten Thread -Verteilung durch den Java EE -Container durchgeführt wird, ist es wichtig, die Thread -Stapelverfolgung zu verstehen und zu verstehen, und kann es für Sie aus den Thread -Stapeldaten identifizieren. Anfragen werden den Java EE -Container ausführen.
Aus Sicht der Analyse eines Thread -Speicherstapels können Sie den Unterschied zwischen dem aus JVM entdeckten Thread -Pool verstehen und die Art der Anforderung identifizieren.
Der letzte Abschnitt bietet Ihnen einen Überblick über den JVM -Thread -Stack für Hotsop V, das Ihnen bereitgestellt wird.
Bitte beachten Sie, dass Sie aus den grundlegenden Gründen einen Thread -Stapel -Beispiel für diesen Artikel erhalten können.
JVM Thread Stack -Was ist es?
Der JVM -Thread -Stapel ist ein bestimmter Zeitnapshot, der Ihnen eine vollständige Liste aller erstellten Java -Threads zur Verfügung stellen kann.
Jeder gefundene Java -Thread gibt Ihnen die folgenden Informationen:
Der Name des Threads wird häufig vom Middleware -Hersteller verwendet, um das Logo des Threads zu identifizieren, und es wird im Allgemeinen den zugewiesenen Thread -Pool -Namen und den zugewiesenen Status (Ausführen, Block usw.).
Thread -Typ & Priorität, zum Beispiel: Daemon Prio = 3 ** Middleware -Programm erstellt im Allgemeinen ihre Threads in Form von Hintergrundvorzustand, was bedeutet, dass diese Threads im Hintergrund Dienste liefern. An Ihre Java ee -Anwendung **
Java -Thread -ID wie: TID = 0x000000011e52A800 ** Dies ist die Java -Thread -ID, die über Java.lang.Thread.getId () erhalten wurde.
Native Thread -ID, z.
Java -Thread -Status und detaillierte Informationen wie: Warten auf Monitoreintrag [0xffffffffea5AFB000] java.lang.thread.state: Block (auf Objektmonitor)
** Sie können schnell den möglichen Grund verstehen, warum der Thread -Status derzeit extrem blockiert ist **
Java -Thread -Stapelverfolgung; Ursache für viele Arten von Problemen, 90%der Informationen erforderten.
Java Stack Memory Decomposition; Diese Informationen sind sehr nützlich bei der Analyse der durch häufigen GCs verursachten Probleme. Sie können die bekannten Thread -Daten oder -modus verwenden, um eine schnelle Positionierung zu erreichen.
Heappsynggen insgesamt 466944K, verwendet 178734K [0xffffffffffff45c00000, 0xffffffffff70800000, 0xfffffffffffffffffffell, Eden Space 233472K, 76% ig verwendeten F45C00000, 0xffffffffffffffrfffr. fffffffffff62400000, 0xffffffFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70800000) E 233472K, 0% UserD [0xffffffffffffffffffrt54000000, 0xFFFFFFFFFFFFFFFFFFFFFFRET54000000 , 0xffffffffFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFEFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFEFFEFFFFFFFFFFFFFFFFFFFFFEHLE), VERWENDUNG 00000) PSPERMGEN Gesamt 262144K, verwendet 248475k, 0xffffffee0400000, 0xffffffffff0400000) Objektraum 262144K, 94 % verwendet [0xffffffffed0400000 , 0xffffffedf6f08,0xffffffffffee0400000)
Große Demontage von Thread -Stapel -Informationen
Um jedem besser zu verstehen, wird das folgende Bild in diesem Bild zur Verfügung gestellt.
In der obigen Abbildung ist ersichtlich, dass der Fadenstapel aus mehreren verschiedenen Teilen besteht. Diese Informationen sind wichtig für die Analyse des Problems, aber die Analyse verschiedener Problememodus verwendet unterschiedliche Teile (der Problemmodus simuliert und zeigt in den späteren Artikeln.)
Jetzt im Beispiel dieses Analyse -Beispiels werde ich die Komponenten des Hotspots für Thread -Stapelinformationen ausführlich erklären:
# Voller Thread Dump
"Full Thread Dump" ist ein globales Schlüsselwort. Dies ist der Beginn des Thread Stack Snapshot.
Full Thread Dump Java Hotspot (TM) 64-Bit-Server VM (20,0-B11-Mischmodus):
# Java ee Middleware, Dritte und Threads in der benutzerdefinierten Anwendungssoftware
Dieser Teil ist der zentrale Teil des gesamten Thread -Stapels und ist auch der Teil, der normalerweise die Zeit analysieren muss. Die Anzahl der Stapel -Midlines hängt von der von Ihnen verwendeten Middleware ab, einer dritten Bibliothek (möglicherweise unabhängige Threads) und Ihrer Anwendung (wenn Sie einen benutzerdefinierten Thread erstellen, ist dies normalerweise keine gute Praxis).
In unserem Beispiel -Thread -Stack ist Weblogic die Middleware, die wir verwenden. Ausgehend von Weblogic 9.2 verwenden Sie den einzigartigen Thread -Pool, von dem man verwaltet werden kann. "
"[Standby] ExecutThead: '414' für Queue: 'Weblogic.kernel.Default (Selbstabstimmung)'" Daemon Prio = 3 Tid = 0x000000010916a800 Nid = 0x2613 In Object. Zustand: Warten (auf Objektmonitor) bei Java.lang.Object.wait (native Methode) -Erwarten Sie auf <0xffffff27D44DE0> (a weblogic.work.executethead). Work.work.cutethread.waitForRequest (executethread.java:160) -Locked <0xffffffffff27d44de0> (a weblogic.work.executethead) C.Work.Executethread.run (executethead.java:181))
# Hotspot VM Thread
Dies ist ein interner Thread, der von Hotspot VM für den nativen Betrieb interner Operationen verwaltet wird. Im Allgemeinen müssen Sie nicht zu viel dagegen tun, es sei denn, Sie finden eine hohe CPU -Besatzungsrate, es sei denn, Sie (durch verwandte Thread -Stapel und Prstat- oder Native Thread ID).
"VM Periodic Task Thread" PRIO = 3 TID = 0x0000000101238800 NID = 0x19 Warten auf Bedingung
# Hotspot GC -Thread
Wenn Sie Hotspot für paralleles GC verwenden (jetzt ist es in der Umgebung mehrerer physischer Kerne üblich), verwaltet der Hotspot VM standardmäßig oder jeder JVM einen GC -Thread mit einem bestimmten Logo. Durch die regelmäßige GC -Aufräumarbeiten werden gleichzeitig die Gesamtverringerung der GC -Zeit verursacht.
"GC TASK Thread#0 (Parallelgc)" prio = 3 tid = 0x0000000100120000 nid = 0x3 runnable "GC TASK Thread#1 (Parallelgc)" prio = 3 tid = 0x0000131000 NID = 0x444 runnable ………………………… …………………………………………………………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………………………………………………………….
Dies ist eine kritische Daten, da Sie bei Problemen im Zusammenhang mit GC wie übermäßiger GC- und Speicherlecks auf Probleme stoßen, können Sie das Betriebssystem oder Java -Thread verwenden, das dem nativen ID -Wert dieser Threads zugeordnet ist Richtig.
# JNI Global Referenzzahl
Die globale Referenz von JNI (Java Local Interface) ist vom lokalen Code auf das grundlegende Objekt des Java -Objekts, das vom Java -Müllsammler verwaltet wird. Müllsammlung.
Gleichzeitig ist es auch wichtig, JNI -Verweise zu beachten, um JNI -bezogene Lecks zu erkennen.
JNI Globale Referenzen: 1925
# Java Stack verwenden Sie Ansicht
Diese Daten wurden zu JDK 1.6 hinzugefügt, wodurch Sie einen kurzen und schnellen Blick auf den Hotspot -Stack geben. und der Java -Stapel in einem separaten Schnappschuss, damit Sie zu diesem Zeitpunkt in einem bestimmten Java -Stapel -Speicherraum analysieren (oder ausschließen) können.
Heap Psyoungggen insgesamt 466944K, verwendet 178734K [0xffffffffff45c00000, 0xffffffff70800000, 0xfffffffffffffffffffffffsist fffffffff62400000, 0xffffffFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70800000) E 233472K, 0% verwendet [0xfffffffffffffffffffffffziert, 0XFFFFFFFF540000, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62400000) PSOLDGEN TOTAL 1400832K, UNDEN Fffffffff45BFFFFFFB8,0xffffffffFFFFFFFFF45C00000) PSPERMGEN TOTAL 262144K, verwendet 248475K [xffffffffffFFFFED0400000, 0xffffffffeFee0400000, 0xffffffFFFEFFEFFEFFFFEFFFEFFFEFFFEL) Objekt Space 262144K, 94% verwendet [0xffffffffffed0400000,0XFFFFFFFFFFFFFFFFFFE6A6F08,0XFFFFFFFFFFEE040000