Ich analysiere die Unterschiede zwischen den Ansätzen für das Erstellen von Thread-Dumps. Hier sind die paar von denen ich recherchiere
Definieren einer jmx-Bean, die beim Klicken auf eine deklarierte Bean-Operation jstack durch Runtime.exec () auslöst.
Daemon-Thread, der "ManagementFactory.getThreadMXBean (). DumpAllThreads (true, true)" wiederholt nach einem vordefinierten Intervall ausführt.
Beim Vergleich der Thread-Dump-Ausgaben zwischen den beiden sehe ich die folgenden Nachteile mit Ansatz 2
Ich würde mich über Anregungen/Eingaben freuen
Gibt es irgendwelche Nachteile bei der Ausführung von jstack durch Runtime.exec () im Produktionscode? irgendwelche Kompatibilitätsprobleme auf verschiedenen Betriebssystemen - Windows, Linux?
Jeder andere Ansatz, um Thread-Dumps zu erstellen?
Vielen Dank.
Bearbeiten -
Ein kombinierter Ansatz von 1 und 2 scheint der Weg zu sein. Wir können einen dedizierten Thread im Hintergrund ausführen und die Thread-Dumps in der Protokolldatei in einem Format drucken, das von den Thread-Dump-Analysatoren verstanden wird. Falls weitere Informationen benötigt werden (wie etwa die native Thread-ID), die nur protokolliert werden Bei der Jstack-Ausgabe machen wir dies manuell nach Bedarf.
Sie können verwenden
jstack {pid} > stack-trace.log
als Benutzer in der Box ausgeführt, in der der Prozess ausgeführt wird.
Wenn Sie dies mehrmals ausführen, können Sie eine diff
verwenden, um leichter zu sehen, welche Threads aktiv sind.
Zur Analyse der Stack-Traces verwende ich die folgenden Samples regelmäßig in einem dedizierten Thread.
Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
Mithilfe dieser Informationen können Sie die ID des Threads, den Ausführungsstatus und den Vergleich der Stapelverfolgungen ermitteln.
Bei Java 8 im Bild ist jcmd der bevorzugte Ansatz.
jcmd <PID> Thread.print
Hier ist der Ausschnitt aus der Oracle-Dokumentation :
Mit dem Release von JDK 8 wurden Java Mission Control, Java Flight Recorder und das Dienstprogramm jcmd zur Diagnose von Problemen mit JVM und Java-Anwendungen eingeführt. Es wird empfohlen, das neueste Dienstprogramm jcmd anstelle des vorherigen Dienstprogramms jstack zu verwenden, um die Diagnose zu verbessern und den Aufwand für die Leistung zu reduzieren.
Wenn Sie dies mit der Anwendung versenden, kann dies jedoch Auswirkungen auf die Lizenzierung haben, die ich nicht sicher bin.
Wenn es ein * nix wäre, würde ich kill -3 <PID>
versuchen, aber dann müssen Sie die Prozess-ID kennen und vielleicht haben Sie keinen Zugriff auf die Konsole?
Ich würde vorschlagen, dass Sie die gesamte Heap-Analyse in einer Staging-Umgebung durchführen, wenn es eine solche Umgebung gibt, und die erforderliche Anwendungsserver-Optimierung für die Produktion widerspiegeln. Wenn Sie die Speicherauszüge zur Analyse der Speichernutzung Ihrer Anwendung benötigen, sollten Sie zur besseren Analyse eventuell ein Profil erstellen.
Heap-Dumps werden normalerweise als Ergebnis von OutOfMemoryExceptions
generiert, das auf Speicherverluste und fehlerhafte Speicherverwaltung zurückzuführen ist.
Überprüfen Sie die Dokumentation Ihres Application Servers. Die meisten modernen Server verfügen über Mittel zur Erstellung von Dumps zur Laufzeit. Abgesehen von der normalen Ursache, die ich bereits erwähnt habe, ist der Dump möglicherweise herstellerspezifisch.