Was tun bei Memory Leaks?

OutOfMemoryErrors analysieren

Viele Entwickler haben es bereits erlebt: Java-Anwendungen geht mitunter der Speicher aus. Normalerweise verhält sich die Anwendung dann "seltsam" oder reagiert nicht mehr und im Logfile ist ein OutOfMemoryError zu sehen.
Solange man sich in der Entwicklungsumgebung befindet und das Verhalten reproduzierbar ist, ist die Analyse einfach. Man bedient sich eines (in der Regel kommerziellen) Profilers und analysiert mit dessen Hilfe die Objektreferenzen und den von diesen allokierten Speicher. Memory Leaks kommt man damit leicht auf die Spur.
Schwieriger ist die Situation, wenn das Problem nur sporadisch oder nur in der Produktiv-Umgebung auftritt.

HPROF-Dateien
Dort kann man über die JVM-Option -XX:+HeapDumpOnOutOfMemoryError erzwingen, dass in einer OutOfMemory-Situation ein binärer Dump des Speicherinhalts in eine HPROF-Datei (Dateiname   "java_pidXXXX.hprof") geschrieben wird. Unterstützt wird dieses Feature in Java 6 sowie ab 5.0u7, in Java 1.4 nur bedingt. HPROF-Dumps sind plattformunabhängig und können recht groß werden (entsprechend dem Speicherverbrauch der JVM zum Zeitpunkt des Snapshots).

Vorteil: Exakt zum Fehlerzeitpunkt wird ein Dump geschrieben, der sich anschließend auswerten lässt. Insbesondere bei Server-basierten Anwendungen kann dies sehr hilfreich sein, um Memory Leaks von einem schlichtweg zu klein konfigurierten Java Heap zu unterscheiden.
Über das Kommandozeilen-Tool jmap (sowie 5 und 6) kann außerdem zu einem beliebigen Zeitpunkt ein Memory Snapshot einer laufenden JVM angefordert werden (jmap -dump:file=path_to_file java_pid).

Analyse
Zur Analyse der HPROF-Dateien kommt mit Java 6 das Utility jhat mit (Aufruf: jhat java_pidXXXX .hprof). Bei großen Dumps wirkt jhat allerdings überfordert. Sehr gute Erfahrungen konnten hingegen mit YourKit als kommerziellem Profiler gemacht werden, der das Laden von HPROF-Snapshots unterstützt. Die Darstellung der Objekte und der von diesen belegte Speicher entspricht der gewohnten Ansicht einer Profiling-Session, so dass die Ursachenfindung in gewohnter Weise erfolgen kann.