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.