Wie kann man Java Heap Dumps zuverlässig erstellen?

9

Mein Team stößt auf Schwierigkeiten, wenn es versucht, gute Heap-Dumps zu erstellen, die von OutOfMemoryErrors ausgelöst werden. Aus bestimmten Gründen verwenden wir derzeit die Dumps mit jmap, die von einem Bash-Skript aufgerufen wurden, anstatt das HeapDumpOnOutOfMemoryError-Flag zu verwenden. Wir verwenden eine 64-Bit-1.6-JVM mit einer Heap-Größe von ca. 3 GB. Unsere Heap-Dumps fallen in 90% der Fälle aus (Schätzung).

Können wir irgendetwas tun, um unsere Chancen auf einen sauberen Heap-Dump zu verbessern, mit dem wir Speicherprobleme beheben können? Ich habe gelesen, dass jmap große Probleme in Java 1.4 hatte, aber dass diese Probleme jetzt größtenteils behoben werden sollten.

Karlcyr
quelle
4
Ich nominiere diese Frage für "am ungewollt ekelhaftesten klingend".
phoebus
1
Hah- Ich habe darüber nachgedacht, es absichtlich ekelhaft klingen zu lassen, aber ich bin neu hier und ich war mir nicht sicher, wie die Community das aufnehmen würde :).
Karlcyr

Antworten:

7

Welches ist Ihr Betriebssystem? (Ich kann keine Kommentare hinzufügen).

Für Solaris gcore <pid>erzielen wir bessere Ergebnisse, indem wir zuerst einen Core-Dump ( ) erzwingen und dann jmap an die Core-Dump-Datei ( jmap -heap:format=b <path to java bin> <path to core>) anhängen.

gcoreist ein * nix-Dienstprogramm zum Generieren eines Abbilds eines laufenden Programms. Siehe Link .

fglez
quelle
habe es mit gdb unter linux versucht und es funktioniert super.
Christian
Welches JDK hat "gcore"? meins, Sun 32 Bit JDK für Linux 1.6.0.20 hat es nicht.
Djangofan
Bearbeitet mit Gcore-Klarstellung.
Fglez
2

Wir haben eine JSP, die ManagementFactory.getThreadMXBean () abfragt und einen Bericht erstellt. Möglicherweise nicht nützlich, wenn die App abgestürzt ist. Wenn Sie jedoch jede Minute oder so eine Umfrage durchführen, erhalten Sie eine Vorstellung davon, was passiert.

Mehr Infos hier.

Rytis
quelle
2

Sie können Ihre Anwendung über jmx von außen überwachen. Wenn Sie einige Metriken kennen, die auf ein bevorstehendes OutOfMemory hinweisen, können Sie einen jmap-Lauf auslösen, bevor die Ausnahme ausgelöst wird.

Christian
quelle
Danke Christian - ist jmap eher zuverlässig, bevor der Fehler ausgelöst wird?
Karlcyr
jmap benötigt noch einige Zeit, um einen Heap-Dump zu erhalten. Sie erhalten jedoch einen vollständigen Heapdump, solange Ihr JVM / Tomcat die Hauptverantwortung trägt.
Christian
Ich denke, das sauberste und einfachste Tool dafür ist "Visual VM". Es könnte außerhalb des Geltungsbereichs liegen, aber ein benutzerdefiniertes Plugin für VisualVM zu erstellen, das den Zustand erkennt und den automatischen Speicherauszug aus VisualVm heraus übernimmt, wäre meiner Meinung nach fantastisch.
Djangofan
2

Vielen Dank an Sie alle für Ihre Vorschläge.

Am Ende haben wir ein Skript geschrieben, um die Garbage Collection-Protokolle aktiv zu überwachen. Nach unserer Erfahrung stehen Back-to-Back-Full-GCs fast immer vor einem OOM, sodass unser Skript dieses Ereignis erkennt, den Server ordnungsgemäß aus dem Lastausgleichspool entfernt und den Heap-Dump erzwingt. Dies hat unsere Effektivität erheblich gesteigert.

Karlcyr
quelle
2

Dies ist eine ziemlich alte Frage, aber ich werde sie mit der Hoffnung beantworten, dass jemand dies nützlich finden könnte.

jmap hat eine -F-Option (force). Dies hat sich in der Vergangenheit für mich als nicht so gut erwiesen. Wenn Sie die Option -F verwenden möchten, würde ich empfehlen, dass Sie auch das Verzeichnis java.io.tmp als Teil des Befehls jmap angeben. Es gab ein Problem mit JVM Version 1.6.22, bei dem das Dienstprogramm jmap aufgrund einer temporären Verzeichniseinstellung nicht ordnungsgemäß funktionierte.

Sie können auch versuchen, einen Core-Dump über gdb zu erstellen. Sobald Sie den Kern haben, kann jmap den Kern in einen Heap-Dump konvertieren.

Nick Hristov
quelle