28. November 2007

Heap Dump erstellen und analysieren

Vor JDK 1.6 kann ein HeapDump nur im Fehlerfall  über folgende VM-Argumente geschrieben werden:

-XX:HeapDumpPath=path -XX:HeapDumpOnOutOfMemoryError

Nachtrag (Danke an Markus Kohler, siehe Kommentar): Mit JDK 1.4 und JDK 1.5 gibt es in den neueren Versionen auch die Option

-XX:+HeapDumpOnCtrlBreak

Das ermöglicht beim Drücken von "Ctrl" + "Break" einen HeapDump in das Ausführungsverzeichnis zu schreiben.
Die
HeapDumpPath hat hier keine Auswirkung.

Ab JDK 1.6 kann über folgendes VM-Argument ein HeapDump geschrieben werden.
Das Schreiben findet aber erst nach Beendung des Programms statt.


-Xrunhprof:format=b,file=mysnapsot.hprof

Alternativ kann man auch zur Laufzeit eines Java-Programms einen
Heap-Dump erzeugen über das Tool jmap im Bin-Verzeichnis des SDK:

jmap -dump:format=b,file=snapshot2.hprof <pid>

Eine weitere Möglichkeit bietet JMX. In der MBean

com.sun.management:type=HotSpotDiagnostic

gibt es die Methode

dumpHeap(String , boolean )


Über diese kann ebenfalls im laufenden Betrieb ein Dump erstellt werden.


Analysiert werden kann der Dump dann z.B. über

  • jhat.exe mysnapsot.hprof
    • (im JDK-Bin-Verzeichnis) Startet per Default einen WebServer auf Port 7000.
    • Den Dump kann man sich im Browser unter der Adresse http://localhost:7000 anschauen
  • den kostenlosen SAP Memory Analyzer - eine komfortabele Oberfläche auf Basis Eclipse RCP

Beispiel: Tomcat Session
org.apache.catalina.session.StandardSession

1 Kommentar:

Unknown hat gesagt…

Hallo Rainer,
Unter JDK 1.4 (und bei 1.5 geht es womöglich mittlerweile auch) kann man die HeapDumpOnCtrlBreak Option setzen. Siehe meinen Blogeintrag hierbr/>

Gruss,
Markus