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.
java
oom
outofmemoryerror
dump
Karlcyr
quelle
quelle
Antworten:
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.gcore
ist ein * nix-Dienstprogramm zum Generieren eines Abbilds eines laufenden Programms. Siehe Link .quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle