web-dev-qa-db-ger.com

Fadendumps in der Produktion aufnehmen

Ich analysiere die Unterschiede zwischen den Ansätzen für das Erstellen von Thread-Dumps. Hier sind die paar von denen ich recherchiere

  1. Definieren einer jmx-Bean, die beim Klicken auf eine deklarierte Bean-Operation jstack durch Runtime.exec () auslöst.

  2. 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

  1. Mit Methode 2 protokollierte Thread-Dumps können nicht mit Open-Source-Thread-Dump-Analysatoren wie TDA analysiert werden
  2. Die Ausgabe enthält nicht die native Thread-ID, die bei der Analyse von Problemen mit der CPU hilfreich sein könnte (richtig?).
  3. Nicht mehr?

Ich würde mich über Anregungen/Eingaben freuen

  1. Gibt es irgendwelche Nachteile bei der Ausführung von jstack durch Runtime.exec () im Produktionscode? irgendwelche Kompatibilitätsprobleme auf verschiedenen Betriebssystemen - Windows, Linux?

  2. 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.

20
Andy Dufresne

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.

31
Peter Lawrey

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.

7
Arnab Biswas

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?

4

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.

0
Waleed Madanat