Wie bereits erwähnt, jstack
ist es großartig, weil es den vollständigen Stack-Trace aller aktiven Threads in der JVM liefert. Dasselbe kann mit SIGQUIT auf stderr der JVM abgerufen werden.
Ein weiteres nützliches Tool ist, jmap
das mithilfe der PID des Prozesses einen Heap-Dump aus dem JVM-Prozess abrufen kann:
jmap -dump:file=/tmp/heap.hprof $PID
Dieser Heap-Dump kann in Tools wie visualvm
(die jetzt Teil der Standard-Java-SDK-Installation von Oracle mit dem Namen jvisualvm sind) geladen werden. Darüber hinaus kann VisualVM eine Verbindung zur laufenden JVM herstellen und Informationen zur JVM anzeigen, darunter Diagramme zur internen CPU-Auslastung, zur Thread-Anzahl und zur Heap-Auslastung - ideal, um Lecks aufzuspüren.
Ein anderes Tool jstat
kann Garbage Collection-Statistiken für die JVM über einen Zeitraum erfassen, ähnlich wie vmstat, wenn es mit einem numerischen Argument ausgeführt wird (z. B.vmstat 3
. ) ausgeführt wird.
Schließlich ist es möglich, einen Java-Agenten zu verwenden, um die Instrumentierung aller Methoden aller Objekte zur Ladezeit zu übertragen. Die Bibliothek javassist
kann dabei helfen, dies sehr einfach zu machen. Es ist also möglich, eine eigene Ablaufverfolgung hinzuzufügen. Das Schwierige dabei wäre, einen Weg zu finden, um die Trace-Ausgabe nur dann zu erhalten, wenn Sie es wollten, und nicht die ganze Zeit, was die JVM wahrscheinlich zu einem Crawl verlangsamen würde. Es gibt ein Programm, dtrace
das so funktioniert. Ich habe es versucht, war aber nicht sehr erfolgreich. Beachten Sie, dass Agenten nicht alle Klassen instrumentieren können, da diejenigen, die zum Bootstrap der JVM erforderlich sind, geladen werden, bevor der Agent instrumentieren kann. Dann ist es zu spät, diesen Klassen Instrumentation hinzuzufügen.
Mein Vorschlag - Beginnen Sie mit VisualVM und prüfen Sie, ob dies die wichtigsten Informationen enthält, da die aktuellen Threads und wichtigen Statistiken für die JVM angezeigt werden können.
Ebenso wenig können Sie beim Debuggen von fehlerhaften Programmen auf einem Linux-System ähnliche Tools zum Debuggen von JVMs auf Ihrem System verwenden.
Tool Nr. 1 - jvmtop
Ähnlich
top
können Sie mit jvmtop feststellen , welche Klassen in den ausgeführten JVMs auf Ihrem System aktiv sind. Nach der Installation rufen Sie es folgendermaßen auf:Die Ausgabe sieht ähnlich aus wie das Werkzeug
top
:Tool Nr. 2 - jvmmonitor
Eine andere Alternative ist die Verwendung von jvmmonitor . JVM Monitor ist ein in Eclipse integrierter Java-Profiler zur Überwachung von CPU, Threads und Speichernutzung von Java-Anwendungen. Sie können damit entweder automatisch laufende JVMs auf dem Localhost finden oder über einen Port @ Host eine Verbindung zu Remote-JVMs herstellen.
Tool # 3 - Visualisierung
VisualVM ist wahrscheinlich "das Werkzeug", um Probleme mit der JVM zu beheben . Der Funktionsumfang ist ziemlich umfangreich, und Sie können einen sehr detaillierten Einblick in die Innereien erhalten.
Profilieren Sie die Anwendungsleistung oder analysieren Sie die Speicherzuordnung:
Thread-Dumps nehmen und anzeigen:
Verweise
quelle
Überlegen Sie
jstack
. Nicht ganz das Gleiche fürstrace
, eher einpstack
-analog, aber Sie erhalten zumindest ein Bild eines Schnappschusses in der Zeit. Könnte sie aneinander reihen, um eine grobe Spur zu bekommen, wenn du müsstest.Siehe auch die Vorschläge in diesem SO-Artikel: https://stackoverflow.com/questions/1025681/call-trace-in-java
quelle
Wenn Sie RHEL OpenJDK verwenden (oder ähnliches, der Punkt ist, dass es nicht Oracle's JDK ist), können Sie dafür SystemTap verwenden .
Einige Sonden werden aktiviert , indem Java - Befehlszeilenoptionen
-XX:+DTraceMethodProbes
,-XX:+DTraceAllocProbes
,-XX:+DTraceMonitorProbes
. Beachten Sie, dass das Aktivieren dieser Tests die Programmleistung erheblich beeinträchtigt.Hier ist ein Beispiel für ein SystemTap-Skript:
Sie können auch verwenden
jstack()
, um den Java-Stapel des Prozesses abzurufen . Dies funktioniert jedoch nur, wenn Sie SystemTap vor JVM starten .Beachten Sie, dass SystemTap jede Methode verfolgt. Es ist auch nicht in der Lage, die Argumente der Methode abzurufen. Eine weitere Option ist die Verwendung von JVM-eigenen Tracing-Funktionen, die als JVMTI bezeichnet werden. Eine der bekanntesten JVMTI-Implementierungen ist BTrace .
quelle
Es wird empfohlen, Jackplay auszuprobieren , ein JVM-Tracing-Tool, mit dem Sie Methodenein- und -ausgänge nachverfolgen können , ohne den Code zu ändern oder erneut bereitzustellen.
quelle