Allgemeine Strategie zum Auflösen von Java-Speicherlecks?

Ich habe ein eigenständiges Programm, das ich lokal ausführe, es ist ein Server-Programm, das rund um die Uhr läuft. Kürzlich habe ich festgestellt, dass es ein Speicherleck hat, momentan ist unsere einzige Lösung, es alle 4 Stunden neu zu starten. Was ist der beste Weg, um dieses Speicherleck zu finden? Welches Werkzeug und welche Methode sollten wir verwenden?

Wenn Sie Java von Sun verwenden und mindestens Java 6 Update 10 (dh das neueste) verwenden, versuchen Sie, jvisvalvm vom JDK auf demselben Computer auszuführen, auf dem das Programm ausgeführt wird, und hängen Sie es an und aktivieren Sie die Profilerstellung.

Dies ist wahrscheinlich der einfachste Weg, um loszulegen.

Wenn es um die Suche nach Speicherproblemen geht, verwende ich den SAP Memory Analyzer Eclipse Memory Analyzer (MAT) , ein Heap-Dump-Analysetool.

Der Memory Analyzer bietet ein universelles Toolkit zur Analyse von Java-Heap-Dumps. Neben dem “Heap-Walking” und der schnellen Berechnung der beibehaltenen Größen meldet das Eclipse-Tool Leckverdächtige und Speicherverbrauchs-Anti-Patterns. Hauptanwendungsgebiet sind Speichererrors und hoher Speicherverbrauch.

Das Projekt, das von SAP initiiert wurde, ist seither Open Source und wird heute als Eclipse Memory Analyzer bezeichnet . Schauen Sie sich die Seite ” Erste Schritte ” an und besonders den Abschnitt ” Speicherlecks suchen ” (ich füge ihn unten ein, weil ich einige Links korrigiert habe):

Beginnen Sie mit dem Ausführen des Leckberichtes, um automatisch nach Speicherlecks zu suchen.

In diesem Blog erfahren Sie, wie Sie ein undichtes Workbench-Fenster finden .

Der Memory Analyzer ist bei SAP aufgewachsen. Damals bloggte Krum über das Finden von Speicherlecks mit SAP Memory Analyzer . Der Inhalt ist immer noch relevant!

Dies ist wahrscheinlich das beste Tool, das Sie (auch für Geld) für die Analyse von Heap-Dumps (und Speicherlecks) bekommen können.

PS: Ich arbeite nicht für SAP / IBM / Eclipse, ich bin nur ein sehr glücklicher MAT-Benutzer mit positivem Feedback.

Sie benötigen einen Speicherprofiler . Ich empfehle den Netbeans Profiler .

Sie können JMX und die Jconsole-App nachschlagen, die mit Java ausgeliefert wird. Sie können einige interessante Statistiken out-of-the-box erhalten, und das Hinzufügen einiger einfacher Instrumente zu Ihren classn kann viel mehr bieten.

Ein Ansatz wäre es, regelmäßig Heap-Dumps zu erstellen und dann die Instanzanzahl Ihrer classn zu analysieren, um herauszufinden, welche Objekte konsistent erstellt, aber nicht gesammelt werden.

Eine andere Möglichkeit wäre, Teile Ihrer App auszuschalten, um zu versuchen, das Problem einzugrenzen.

Sehen Sie sich Tools wie Jmap und Jhat an.

Wie bereits erwähnt, ist jvisualvm eine gute Möglichkeit, um loszulegen, aber sobald Sie wissen, was leckt, müssen Sie möglicherweise herausfinden, was Referenzen zu den fraglichen Objekten enthält, für die ich jmap und jhat empfehlen würde, z

jmap -dump:live,file=heap.dump.out,format=b  

und

 jhat heap.dump.out 

wo leicht von jvisualvm gefunden wird. Navigieren Sie dann in einem Browser zu localhost: 7000 und beginnen Sie mit der Suche.