Alternativen zur Heapdump-Erstellung mit höherer Leistung als jmap?

Alternativen zur Heapdump-Erstellung mit höherer Leistung als jmap?

Ich muss Heapdumps erstellen, was mit jmap gut funktioniert. Mein Problem ist, dass jmap sehr lange braucht, um die Heapdump-Datei zu erstellen. Besonders wenn der Heap größer wird (> 1 GB), dauert es zu lange.

Eine Situation als Beispiel:
Wenn der Server Probleme mit dem Heapspace hat, möchte ich ihn automatisch neu starten und vor dem Neustart einen Heapdump erstellen. Das funktioniert zwar, dauert aber zu lange, um den Heapdump zu schreiben. Dadurch ist der Server zu lange down. Die Heapdump-Erstellung dauert länger als eine Stunde.

Ich weiß davon -XX:+HeapDumpOnOutOfMemoryError, aber meistens kann ich das Speicherproblem finden, bevor die Ausnahme von der JVM ausgelöst wird.

Gibt es eine Alternative zu jmap, die die Heapdumps schneller schreibt?
Eine spezielle Lösung für das obige Beispiel wäre auch wünschenswert.

Diese Frage ist eine Mischung aus Programmierung und Systemadministration, aber ich denke, ich bin hier am richtigen Ort.

Antwort1

ich habe eine Antwort auf meine Frage gefunden. DasDie Antwort auf eine andere Frage zu Serverfault brachte mich auf die Idee.

  1. Verbinden Sie sich mit gdb mit Ihrem Java-Prozess
    gdb --pid=<your java pid>
  2. Core Dump von GDB erstellen
    gcore <file name>
    detach
    quit
  3. Starten Sie den Java-Prozess neu oder tun Sie, was immer Sie möchten
  4. Erstellen Sie einen Heap-Dump aus dem Core-Dump, indem Sie jmap mit dem Core-Dump verbinden
    jmap -heap:format=b <path to java binary> <core dump file>

In Schritt 4 ist es wichtig, dass Sie die richtige Java-Binärdatei angeben, da sich jmap sonst nicht an den Core Dump anhängen kann. Wenn Sie nicht sicher sind, welche Binärdatei für den Java-Prozess verwendet wurde, öffnen Sie den Core Dump mit gdb:
gdb --core=<core dump file>
Es wird eine Zeile wie diese angezeigt, die Ihnen den vollständigen Pfad angibt:
Core was generated by '/opt/tomcat/bin/jsvc'.

Das Erstellen des Core Dumps ist viel schneller, als das Erstellen des Heapdumps direkt über JMAP. Auf diese Weise können Sie einen Heapdump eines Java-Prozesses ohne zu lange Ausfallzeiten erstellen.

BEARBEITEN:
Wenn Sie die folgende Fehlermeldung erhalten, haben Sie möglicherweise die falsche Java-Binärdatei angegeben:

Error attaching to core file: Can't attach to the core file

Um die richtige Java-Binärdatei für den JMAP-Aufruf zu erhalten, öffnen Sie den Core Dump mit gdb:

gdb --core=[path tp core file]

Es wird eine Zeile wie diese angezeigt, die Ihnen die richtige Binärdatei angibt:

Core was generated by `/opt/tomcat/bin/jsvc'.

verwandte Informationen