Artikel

 
Januar 2010 | Artikel

Analyze me!

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2799)

Der Eclipse Memory Analyzer

Text: Dominik Stadler
SAP hat zu Eclipse ein mächtiges Tool zur Analyse von Out-Of-Memory-Situationen in Java-Anwendungen beigesteuert, den "Eclipse Memory Analyzer". Mit Eclipse 3.5 (Galileo) ist dieser erstmals Teil der koordinierten Veröffentlichung verschiedener Eclipse-Projekte. Neben der reinen Analyse von Speicherlecks kann das Tool noch einiges mehr und hilft bei einer Vielzahl von Problemen mit Java-Anwendungen. Dieser Artikel beschreibt die Verwendung des Memory Analyzers und stellt die verschiedenen Einsatzmöglichkeiten im Bereich Speicher-Analyse und Performance-Verbesserung vor. Anhand einiger Beispiel-Anwendungen wird gezeigt, wie der Eclipse Memory Analyzer wertvolle Dienste für jede Art von Java-Entwicklung leisten kann.
Teil 1   Teil 2   Teil 3   Teil 4   

Kennen Sie das Gefühl, wenn ein Kunde in der ausgelieferten Java-Anwendung einen schwerwiegenden Fehler meldet und man sich beinahe machtlos fühlt, weil das Problem einerseits extrem schwer nachzuvollziehen ist und es andererseits auch den Produktionsbetrieb beim Kunden gefährdet? Häufig sind Speicher-Probleme (mit)verantwortlich, oft ist das erste Indiz der berüchtigte OutOfMemoryError. Für diesen Teilbereich hat Eclipse seit Version 3.5 ein probates Werkzeug an Bord, welches in vielen Fällen helfen kann.

Warum sind Tools zur Speicheranalyse nötig?
Es ist üblicherweise sehr aufwendig bis nahezu unmöglich, Probleme mit dem Speicherverbrauch in Java-Anwendungen manuell zu analysieren. Die automatische Speicherverwaltung in Java mit Garbage Collection macht es noch schwieriger, weil dadurch der angezeigte Speicherverbrauch nicht mit der aktuellen Situation übereinstimmt, da der Speicher eigentlich schon frei ist, Programme wie "top" und "ps" aber dies nicht darstellen.

Geschichte des Eclipse Memory Analyzer
SAP hat mit dem "Eclipse Memory Analyzer" ein mächtiges Tool zur Analyse von Out-Of-Memory-Situationen beigesteuert [5]. Der Eclipse Memory Analyzer (abgekürzt "MAT" für "Memory Analyzer Tool") erlaubt es, sogenannte Heapdumps zu analysieren. Diese Heapdumps sind Speicherabbilder von Java-Anwendungen, die alle Objekte in der Java VM zu diesem Zeitpunkt enthalten. Es ist also eine Art Momentaufnahme des kompletten Zustands der VM. Diese Heapdumps können zur Laufzeit gezogen und anschließend offline analysiert werden. Die Funktionalität, Heapdumps zu erzeugen, wird mit der jeweiligen Java VM mitgeliefert. Bei Sun JVM kann das ab Java 6 das Tool "jmap". Andere Java VMs (JRockit, IBM, ...) haben teilweise andere Binärformate für den Heapdump, MAT bringt aber Unterstützung für eine große Anzahl dieser Formate mit, siehe [3].

Download/Installation
Der Memory Analyzer wird als Eclipse Plug-in zur Verfügung gestellt. Da das Tool seit Eclipse 3.5 Teil der koordinierten Release ist, lässt es sich dort einfach über die Eclipse-Update-Funktionalität installieren. Wer neuere - und evtl. instabile - Versionen ausprobieren möchte, kann die Update-Site http://download.eclipse.org/technology/mat/latest/update-site/ verwenden.

Zusätzlich bietet das Projektteam auch eine Standalone-Version des MAT, bei der alle nötigen Teile von Eclipse enthalten sind und das Ganze somit als eigenständig lauffähige Anwendung zur Verfügung steht.

In der Praxis hat sich gezeigt, dass der MAT bei großen Heapdumps sehr speicherhungrig werden kann, deshalb empfiehlt sich der Einsatz der Standalone-Variante, da dadurch die normale Eclipse IDE nicht in Mitleidenschaft gezogen wird.

Nach dem Download von [1] und dem Entpacken der Zip-Datei in ein neues Verzeichnis kann die ausführbare Datei MemoryAnalyzer gestartet werden.

Falls das Plug-in in der normalen Eclipse IDE verwendet wird, kann nach erfolgreicher Installation via Open Perspective auf Memory Analyzer die gleiche Umgebung wie in der Standalone-Variante erreicht werden.

Vom Speicherproblem zum Heapdump
Wie erhält man nun einen Heapdump aus einer Anwendung? Dazu gibt es mehrere Möglichkeiten:

  • Per Commandline, während die Anwendung läuft.
  • Per Option beim Start der Java VM, sobald ein "OutOfMemoryError" auftritt (siehe [4]).

Am einfachsten ist es, wenn man Sun Java 6 verwendet, denn dann liefert das folgende Kommando einen Heapdump an der gewählten Stelle. Dazu muss man über "top", "ps" oder den Windows Task Manager die sogenannte ProcessId oder PID herausfinden und in den Befehl einsetzen:

  1. jmap -dump:file=/tmp/jmap.hprof <processid>

Unter Windows:

  1. jmap -dump:file=C:\TEMP\jmap.hprof <processid>

Wichtig ist hier die Endung .HPROF, da MAT nur Dateien mit dieser Endung anzeigt. Es können laut [3] auch eine Reihe anderer JDKs/JVMs verwendet werden, die jeweiligen Befehle und unterstützen Arten, einen Heapdump zu erhalten, listet [4]. Auch IBM JDK und Oracle (BEA) JRockit können entsprechende Heapdumps erzeugen.

Starten des Memory Analyzer
Nachdem der Heapdump generiert ist, kann man sich an die Analyse machen. Zu Beginn begrüßt ein Startbildschirm den Anwender, auf dem auch die Dokumentation und weitere Informationen verfügbar sind.

Teil 1   Teil 2   Teil 3   Teil 4   

Anzeige

Kommentare

Gravatar Markus Kohler 21.01.2010
um 12:53 Uhr
Super!
Ich träume jetzt mal davon dass wir in Zukunft mehr von Dynatrace in Richtung Memory Analyzer sehen werden ;-)
#zitieren
Gravatar Dominik Stadler 22.01.2010
um 09:55 Uhr
Leider hat sich der Fehlerteufel eingeschlichen, im Text zu den doppelten Strings passen die Werte im Text nicht mit den Screenshots zusammen, es sollte heissen:

"Es ist hier schon zu sehen, dass sich der String "teststring" 1153 Mal wiederholt und dadurch eine Menge Speicher verbraucht wird. Durch Auswählen von "Details>> " erfährt man auch, wie viel Speicher ungefähr verbraucht wird, in diesem Beispiel "mehr als 192456 Bytes" (Abbildung 8). "
#zitieren
Gravatar Redaktion 22.01.2010
um 10:13 Uhr
Text wurde geändert, vielen Dank! #zitieren

Anzeige

zurück zum Seitenanfang