© DrHitch/Shutterstock.com
Memory Leaks Tools

2 Effective Java: post mortem - Memory Leaks mithilfe von Heap Dumps auffinden


Im vorangegangenen Kapitel unseres shortcuts über Memory Leaks in Java haben wir uns angesehen, wie man mithilfe von Profilern nach Memory Leaks suchen kann. Aber wie kommt man Memory Leaks auf die Spur, wenn die Anwendung sich infolge eines Speichermangels bereits beendet hat? Oft ist es nur der Heap Dump, der dann übrig bleibt. Wie man bei einer solchen Post-mortem-Analyse vorgeht, diskutiert das folgende Kapitel.

Im Zentrum des vorangegangenen Kapitels stand eine dynamische Memory-Leak-Analyse, bei der wir uns mit einem Profiler an eine laufende Anwendung gehängt und speicherneutrale Use Cases beobachtet haben. Dabei haben wir nach Objekten gesucht, die die Use Cases überleben, obwohl sie eigentlich nur für die Verarbeitung gebraucht wurden und hinterher hätten verschwunden sein sollen.

Dieses Mal wollen wir uns die Post-mortem-Analyse ansehen und wie man sie durchführt, nachdem die Anwendung sich bereits (wegen Speichermangels) beendet hat. Für diese Analyse steht in der Regel wenig Information zur Verfügung. Oft ist es nur der Heap Dump, den die JVM beim Abbruch erzeugt hat.

Wie im vorangegangenen Kapitel wollen wir wieder das Beispiel aus unserem ersten Kapitel des vorangegangenen shortcuts über Memory Leaks aufgreifen [1]. Darin haben wir ein kurzes, aber fehlerhaftes Programm mit Memory Leak angesehen. Es ging um die Implementierung eines rudimentären Servers auf Basis der mit Java 7 eingeführten AsynchronousSocketChannels. Pro Client erfolgte ein Eintrag in einer Map, der aber am Ende der Client-Session nicht wieder gelöscht wurde. Das hat zur Folge, dass die Map stetig anwächst. Bei unserem Server führt dies zunächst zu Speicherengpässen mit auffällig langen Stop-the-World-Pausen des Garbage Collectors und am Ende zum Absturz mit OutOfMemoryError. Wie findet man nun ein solches Memory Leak, wenn man nichts weiter als einen Heap Dump zur Verfügung hat?

Post-mortem-Memory-Leak-Analyse

Nehmen wir also an, unser Server ist mit der JVM-Option XX:+HeapDumpOnOutOfMemoryError gestartet worden; dann wird der Heap Dump im Falle der JVM-Terminierung wegen OutOfMemoryError automatisch erzeugt. Man kann Heap Dumps auch anders erzeugen; dazu der Kasten „Wie bekomme ich einen Heap Dump?“

Ein gutes Werkzeug für die Analyse von Heap Dumps ist der kostenlose Memory Analyzer MAT [2]. Der hat gegenüber anderen Werkzeugen den Vorteil, dass er auch sehr große Heap Dumps verarbeiten kann. Das schafft er, weil er den Heap Dump zuallererst einmal indiziert, damit er hinterher in vertretbarer Zeit und mit verkraftbare...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang