Memory Analyse Teil 1 – Java Heapdumps erzeugen

Keine Kommentare

Bei Troubleshooting Einsätzen ist der Java Heapdump eines der wichtigsten Hilfsmittel, um Memory Leaks oder hohen Speicherverbrauch zu analysieren. Der Vorteil von Heapdumps ist, dass man sie auch in produktiven Umgebungen erzeugen kann  – also da wo die Probleme am häufigsten auftreten. Alle aktuellen Java Virtual Maschines unterstützen die Erzeugung von Heapdumps, ohne zusätzliche Tools installieren zu müssen.

In dieser Blog Serie möchte ich zeigen, wie man Memory Probleme analysieren und beheben kann. Dazu werden Antipatterns und unterschiedliche Memory Probleme beschrieben und Lösungsszenarien aufgezeigt.

Der erste Teil zu diesem Thema beschäftigt sich mit der elementaren Aufgabe einen Heapdump zu erzeugen – die wichtigste Voraussetzung für eine erfolgreiche Analyse.  Die unterschiedlichen Hersteller von JVMs (Sun, IBM, BEA) haben unterschiedliche Werkzeuge und Dump Formate in die JVMs integriert – dieser Blog wird die Implementierung von Sun betrachten und am Ende Hinweise für andere Implementierungen geben.

Die Sun Java Virtual Maschine enthält mehere Tools und Optionen, um einen Heapdump zu erstellen:

– Automatisch bei einem java.lang.OutOfMemoryError

– Über das Kommandozeilen Tool jmap

– Über ein bereitgestelltes MBean (Java Management Extension – JMX) und das Tool jconsole

Natürlich gibt es auch die Möglichkeit über das Java Virtual Maschine Tool Interface (JVMTI) einen Dump zu erzeugen – allerdings muss man hierfür einen Agenten in C erstellen. Viele Profiler (z.B. JProfiler) bieten aber die Möglichkeit eine Dump über JVMTI zu erzeugen und die Daten grafisch auszuwerten.

Um automatisch einen Heapdump zu erzeugen, wenn ein OutOfMemoryError geworfen wird, muss man einen JVM Kommandozeilen Parameter beim Start von java mitgeben:

-XX:+HeapDumpOnOutOfMemoryError

Der Parameter bewirkt, dass die JVM bei einem OutOfMemoryError einen Headump im HPROF Format in das aktuelle Verzeichnis schreibt. Der Name des Dumps entspricht der Konvention java_pid.hprof.  Um das Verzeichnis und den Namen der Datei selber zu bestimmen, kann man zusätzlich den Parameter -XX:HeapDumpPath=path_to_file definieren.

Die automatische Erzeugung von Dumps über Parameter ist allerdings nicht immer sinnvoll. In manchen Situation möchte man den Dump auch im laufenden Betrieb erzeugen. Für diesen Fall liefert Java ab Version 1.4.2_09, 1.5.x und 1.6.x das Tool jmap mit. Einen Heapdump im HPROF Format erzeugt man mit durch den Kommandozeilen Befehl jmap -dump:file=path_to_file java_process_id. Die Java Prozess Id legt fest von welcher aktiven, lokalen JVM der Headump angefordert werden soll. Die Prozess Id kann man mit dem JVM Tool jps ermitteln. (Hinweis: Das Tool jmap ist allerdings nicht jeder Plattform und JVM Version verfügbar) Alternativ kann man auch den JVM Parameter -XX:+HeapDumpOnCtrlBreak nutzen und dem Prozess ein SIGQUIT Signal (kill -3 bei Unix und Ctrl-Break bei Windows) senden.

Mit Java 6 hat Sun zusätzlich ein JMX MBean eingeführt, das Methoden zum Erzeugen eines Heapdumps enthält. Um einen Dump über JMX zu erzeugen startet man die integrierte JMX Konsole mit dem Befehl jconsole und verbindet sich mit der entsprechenden JVM. Lokal ist dafür keine weitere Konfiguration der JVM notwendig – möchte man auf eine JVM auf einem anderen Rechner zugreifen, muss JMX entsprechend konfiguriert sein.

Unter der Lasche MBean findet man einen Explorer mit den verfügbaren MBean innerhalb der JVM. Das MBean com.sun.management.HotSpotDiagnostic enthält die gesuchte Methode dumpHeap(String, boolean). Mit Hilfe des ersten String Parameters kann der Pfad und der Name des Heapdumps angegeben werden. Der Screenshot zeigt die entsprechende Ansicht. Drückt man auf den dumpHeap-Button wird ein Memory-Dump der JVM ausgeführt.

Der nächste Teil dieser Serie wird sich mit der Auswertung und dem Aufbau eines Heapdumps beschäftigen und erste Tips zur Analyse von Memory Problemen geben.

Informationen wie man Heapdumps mit der IBM JVM erzeugt finden sich in der IBM JVM Diagnosis Documentation.

Information zu BEA JRockit und dem JRockit Memory Leak Detector finde sich in der JRockit Dokumentation.

Als Mitbegründer und Advisor der codecentric AG berät Mirko bei der strategischen Ausrichtung des Unternehmens. Er ist Geschäftsführer und Mitgründer der Startups CenterDevice und Instana – beides disruptive Geschäftsmodelle auf Basis von Big-Data- und Cloud-Technologien.

Seine Interessen liegen im Bereich der Veränderung von Geschäftsmodellen durch moderne Technologien und Software, also der zunehmenden Digitalisierung der Welt und den daraus resultierenden Veränderungen und Potential für Unternehmen.
Im Privatleben widmet er sich am liebsten seiner Familie, zum sportlichen Ausgleich fährt er Mountainbike.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.