Speicherlöcher finden mit dem Eclipse Memory Analyzer

Ein Klassiker der Softwareentwicklung ist schon immer das Finden und Stopfen von Speicherlöchern. Auch in Zeiten von Java und automatischer Garbage Collection bleibt leider (fast) alles beim Alten.

Java und Speicherlöcher

Wie erzeugt man ein Speicherloch in Java, wenn der Garbage Collector doch alle nicht mehr benutzten Objekte wegräumt?

Ganz einfach. Der GC erkennt nicht mehr benötigte Objekte daran, dass es an keiner Stelle mehr eine Referenz auf das fragliche Objekt gibt. Hällt man also an irgendeiner Stelle in seinem Programmcode — populär sind hier Listen mit String Objekten — noch eine Referenz auf ein Objekt, so wird dieses nicht wieder freigegeben.

Also zurück zum Anfang und alle Referenzen auf unbenutzte Objekte aufräumen aka free();

Finden von Speicherlöchern mit dem Eclipse Memory Analyzer

Der Eclipse Memory Analyzer bereitet einen vorher erstellten Heap Dump grafisch auf und erlaubt auch allerlei automatische Analyseverfahren, um Speicherlöcher aufzuspüren.

Installiert werden kann MAT in der Regel über Help->Install New Software.... Alle Repositories auswählen und nach „Memory Analyzer“ suchen.
Nach der Installation findet man unter Window->Open Perspective->Other.. die Perspektive „Memory Analysis“.

Einen Heap Dump kann man zur Laufzeit mittels

jmap -dump:format=b,file=/tmp/heap.bin [PID]

erstellen.

Um die PID des Java Prozesses zu ermitteln kann das jps Kommando genutzt werden.

Nach erfolgreichem Erstellen des Dumps kann er nach Wechseln zur „Memory Analysis“ Perspektive unter File->Open Heap Dump... geladen werden.

Happy debugging

😀