Name

Eclipse Memory Analyzer (MAT)

Homepage

http://www.eclipse.org/mat/

Lizenz

Eclipse Public Licence (EPL), entwickelt von SAP

Untersuchte Version

Version 0.7.0 vom 10.12.2008 (Incubation Phase)

Letzter Untersuchungszeitpunkt

26.11.2010

Kurzbeschreibung

MAT ist ein umfangreiches Speicheranalyse-Werkzeug, welches es ermöglicht Heap-Dump-Informationen mit dem Dateiformat ".hprof" einzulesen und in vielfacher Art darzustellen, um dem Entwickler die Möglichkeit zu bieten, Speicherlecks schnell und zielsicher ausfindig zu machen.

Fazit

Durch Speicherüberlauf hervorgerufene Programmabstürze, deren Ursache mit einfachen Bordmitteln normalerweise schwierig nachzuvollziehen sind, können mithilfe des Eclipse Memory Analyzers im Nachhinein detailliert betrachtet und nachvollzogen werden.
Der infolge eines Speicherüberlauf generierte Heapdump des Java-Programms wird ganz einfach eingelesen und anhand von vielen auswählbaren Ansichten übersichtlich dargestellt, so dass ein Einblick in das komplette Programm zum Zeitpunkt des Absturzes möglich ist. Mit ein wenig Know-How kann dann schnell die speicherbelastende Softwarekomponente ausfindig gemacht werden.

Einsatzgebiete

Analyse von durch Java generierten Heap-Daten nach Speicherüberlauf innerhalb eines Java-Programms.

Einsatzumgebungen

MAT ist sowohl als Standalone-Programm, als auch als Eclipse-PlugIn einsetzbar, da es ohnehin die grafischen Komponenten von Eclipse benutzt.

Installation

MAT kann auf http://www.eclipse.org/mat/downloads.php in der aktuellsten Version heruntergeladen werden.

Die Standalone-Version ist für folgende Plattformen jeweils als zip-Archiv verfügbar:

Zur Installation muss das zip-Archiv in einen beliebigen Ordner entpackt werden. Die startbare Datei befindet sich daraufhin im Ordner "mat" unter dem Dateinamen "MemoryAnalyzer" (unter Linux, Solaris und MacOSX) bzw. "MemoryAnalyzer.exe" (unter Windows).

MAT kann per Software-Update in eine vorhandene Eclipse-Umgebung als Plugin eingebunden werden. Hierzu ist über "Help" -> "Software Updates..." der Button "Add Site..." zu wählen. Unter "Location" muss die URL "http://download.eclipse.org/technology/mat/0.7/update-site/" eingegeben und mit "OK" bestätigt werden.
Daraufhin kann im linken Fensterteil der Memory Analyzer über die eingerichtete "Memory Update Site" mit Setzen eines Häkchens ausgewählt und mit "Install" installiert werden.
Anschließend muss Eclipse neu gestartet werden. Die "Memory Analysis"-Ansicht lässt sich daraufhin über "Open Perspective" -> "Other" öffnen.

Desweiteren verlangt MAT (in der Eclipse-PlugIn-Variante) auch die Installation der "BIRT Chart Engine", welche der Dartellung der Ergebnisse in Chart-Diagrammen dient. Allerdings wird die aktuelle Version 2.3.1 anscheinend nicht erkannt und nach dem Parsen einer ".hprof"-Datei innerhalb der Eclipse-Umgebung lediglich die Fehlermeldung "BIRT Chart Engine (>2.2.2) not available" ausgegeben.
In der Standalone-Version sind die BIRT-Funktionen schon enthalten und funktionieren hier anstandslos.

Dokumentation

Der Eclipse Memory Analyzer besitzt ein eingebautes und hilfreiches Tutorial mit Anweisungen zum sinngemäßen Umgang mit dem zur Verfügung gestellten Funktionsumfang des Tools.
Diese Seite gibt an, dass keine offizielle Dokumentation in Dokumentenform für das MAT-Projekt existiert. Lediglich ein kleines Wiki mit einer knappen Anleitung zur Erstellung von "HPROF"-Dateien, sowie eine Kurze Beschreibung sind auf der Wiki-Seite von SAP zu finden.

Wartung der Projektseite

Die Projektseite scheint seit der Projekt-Erstellung nicht sonderlich geändert worden sein. Der Internetauftritt ist sowohl auf der durch Eclipse, als auch der durch SAP gehosteten Web-Seite sehr informationsarm.
Allerdings muss hier beachtet werden, dass sich das Projekt erst in der Inkubationsphase befindet und zu erwarten ist, dass zukünftig weitere Informationen zur Verfügung gestellt werden.

Nutzergruppen und Support

Es existiert eine Newsgroup in welcher Nutzer-Fragen regelmäßig beantwortet werden, sowie eine Mailing-List, über welche aktuelle Neuerungen veröffentlicht werden.

Intuitive Nutzbarkeit

Die Installation und das Laden von Heap-Dump-Informationen in das Programm gestalten sich sehr einfach, jedoch ist es umso schwieriger, die dargestellten Informationen auf Anhieb zu verstehen und sinngemäß auszuwerten. Hier kann jedoch das eingebaute Tutorial als Hilfestellung jederzeit zu Rate gezogen werden.

Automatisierung

MAT funktioniert vollautomatisch. Nach dem Parsen der Heap-Informationen werden automatisch Ansichten generiert. Jedoch muss hier differenziert werden, dass es sich um kein "aktives" Tool handelt, welches während der Laufzeit eines Programms Daten mitschneidet, es lassen sich lediglich Heap-Dump-Dateien einlesen, welche daraufhin vollautomatisch analysiert und grafisch bzw. in Tabellenform dargestellt werden.

ANT
Die automatisierte Analyse der Speicherauslastung mittels MAT gestaltet sich schwierig. Es lassen sich zwar sogenannte *.hprof-Dateien erzeugen, die allerdings ein eigenes Datei-Format darstellen. Diese liegen somit nicht in lesbarer Form vor. Stattdessen muss weiterhin die Analyse der Dateien mittels dem MAT-Framework stattfinden.Die MAT-Oberfläche bietet komfortable Möglichkeiten um die Ergebnisse zu begutachten, siehe dazu einführendes Beispiel. Eine automatische Ausführung und somit auch Erzeugung der benötigten *.hprof-Dateien ist mittels Ant möglich. Dazu muss bei dem Aufruf nur der folgende Parameter an die JVM übergeben werden: -XX:+HeapDumpOnOutOfMemoryError.
Eine mögliche Beispielautomatisierung ist hier zu finden.
Maven
Wie unter dem Punkt ANT kurz erläutert wurde, gestaltet sich die automatisierte Ausführung von MAT schwierig. Zum Einen besteht kein vorgefertigtes Plugin das genutzt werden kann, zum Anderen basiert MAT auf der Entwicklungsumgebung Eclipse. Mit ANT war es möglich, über die Konsolenausführung, die sogenannten hprof-Dateien zu generieren. Maven hingegeben ist nicht auf die Ausführung von Programmen ausgelegt, sodass auf externe Plugins zurückgegriffen werden muss. Das Plugin von codehaus ermöglicht zwar die Ausführung von Programmen, allerdings besteht keine Möglichkeit der JVM Argumente zu übergeben. In diesem Fall muss aber das Programm mit dem JVM-Argument -XX:+HeapDumpOnOutOfMemoryError gestartet werden.
Somit ist eine automatische Ausführung des MAT-Frameworks nicht ohne weiteres mit Maven möglich.

Einführendes Beispiel

1 Generieren von JAVA-Heapdumps

Ein einfaches Tool zum Zeichnen von Polygonen per Java2D wird mit einer Funktion erweitert, welche automatisch eine Vielzahl von Polygonpunkten auf der Zeichenfläche generiert. Polygonpunkte sind Paare von Integer-Werten und belegen somit nur sehr wenig Speicher.
Zunächst wird im Projektordner ein Verzeichnis "HeapDump" angelegt, in welches die Dump-Dateien später abgelegt werden sollen.

Run_Configuration

Um zu ermöglichen, dass bei Auftreten eines Speicherüberlaufs überhaupt eine Dump-Datei erzeugt wird, muss im "Run"-Profil der Klasse, welche die main()-Methode beinhaltet, unter "Arguments" der VM-Parameter "-XX:+HeapDumpOnOutOfMemoryError" übergeben werden.
Unter "Working Directory" wird der Punkt "Other" gewählt und "${workspace_loc:Polygon/HeapDump}" als Pfad eingetragen. Dieser verweist in den zuvor erstellten Ordner "HeapDump" im Projekt.
Da das Polygon-Zeichenprogramm von Natur aus nicht sehr speicherhungrig ist, kann hier die Erzeugung eines Heap-Dumps zusätzlich durch das Setzen einer geeigneten Speicherplatzbegrenzung manipuliert werden. Der ergänzende Parameter "-Xms4m -Xmx8m" teilt der Java-VM mit, bei Programmstart 4 MB und daraufhin maximal 8 MB im Arbeitsspeicher zu belegen. Somit wird in jedem Fall bei Überschreiten der 8 MB-Grenze der Heap-Dump wie gewünscht geschrieben.

Die Konfiguration sollte wie folgt aussehen:

Run_Arguments
Das Programm kann nun mit "Run" gestartet werden:

Polygone_GUI

Daraufhin wird der vorbereitete "Hardcore-Test" mit Drücken des untersten Buttons gestartet. Das Programm generiert tausende Polygonpunkte und öffnet anschließend ein Panel zur Anzeige des Zeichenfeldes. Hier ist sofort "optisch sichtbar", dass das Programm aufgrund eines Speicherüberlaufs bei der Generierung der Punkte unterbrochen wurde:

Polygone_Panel

Außerdem gibt die Konsole folgende Meldung aus, welche in den ersten drei Zeilen darauf hinweist, dass der erwartete Dump erzeugt und gespeichert wurde:


java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid16849.hprof ...
Heap dump file created [12128906 bytes in 0.225 secs]
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2746)
	at java.util.ArrayList.ensureCapacity(ArrayList.java:187)
	at java.util.ArrayList.add(ArrayList.java:378)
	at de.fhwiesbaden.poly.Polygon.addPoint(Polygon.java:13)
	at de.fhwiesbaden.poly.PolygonGUI.highEndTest(PolygonGUI.java:337)
	at de.fhwiesbaden.poly.PolygonGUI$12.actionPerformed(PolygonGUI.java:260)
	...

2. Parsen des Heap-Dumps mit dem Memory Analyzer

Der "MemoryAnalyzer" wird nun als Standalone-Tool gestartet. Es erscheint ein schon von Eclipse bekanntes Begrüßungsfenster mit dem Zugriff auf die Hauptfunktionen:

GUI_Welcome

Über "Open a Heap Dump..." oder über das "File"-Menü kann nun die zuvor erzeugte Datei "java_pid16849.hprof" geöffnet werden. Die HPROF-Datei wird daraufhin geparst. Dies kann je nach Größe des Dumps einige Sekunden bis Minuten dauern. Anschließend fragt das Tool wie der Dump geöffnet werden soll. In diesem Beispiel wird nur die Option "Leak Suspects Report" gewählt und mit "Finish" bestätigt.

Getting_Started

Der geladene Heap-Dump ist daraufhin über die Menü-Symbole unterhalb des "xxx.hprof"-Reiters anhand verschiedener Ansichten darstellbar:


View_Overview_Icon Dieses Symbol öffnet die im Folgenden zu sehende Überblick-Seite. In einem Chart-Diagramm werden hier die Klassen dargestellt, deren Objekte bei Ausführung des Programms die höchste Speicherbelastung hatten. Jede Klasse wird durch ein Kuchenstück dargestellt, anhand dessen Größe auf den relativen Anteil des Gesamtspeichers geschlossen werden kann. Außerdem sind zu jedem Kuchenstück die absoluten Größen in Byte/KByte/MByte bzw. die Gesamtgröße (in diesem Beispiel "Total: 7 MB") aufgeführt:

GUI_Overview

Beim Überfahren der Diagrammteile mit der Maus werden im linken Fensterbereich nähere statistische Informationen und Objektwerte zum jeweiligen Klassentypen ausgegeben.
Zusätzlich befinden sich im unteren Bereich Verknüpfungen zu den weiteren Dump-Ansichten.


View_Histogram_Icon Das folgende Klassen-Histogramm zeigt die im Heap-Dump aktiven gekennzeichneten Klassen an mit

Man kann hier z.B. sehen, dass Objekte der Klasse "de.fhwiesbaden.poly.Pair", welche jeweils eine Koordinate eines Polygonpunktes speichern, beim Heap-Dump genau 302765 mal im Speicher vorhanden waren und 4844240 Byte im Speicher belegt haben.
Im linken Fensterbereich "Inspector" werden zusätzliche Details zu den ausgewählten Objekttypen angezeigt. Hier werden u.a. Paketname (de.fhwiesbaden.poly), Klassenname (Pair), Klassen-ID (0xac28f9c0), die Größe eines einzelnen Objekts (8 Byte) und GarbageCollector-Informationen (no GC root) ausgegeben:

GUI_Histogram


DominatorTree Der "Dominator Tree" zeigt für ein bestimmtes Objekt welche anderen Objekte von diesem abhängen und vom Garbage-Collector entfernt werden, sobald dieses Objekt entfernt wird.
Auch hier werden im linken Fensterbereich detaillierte Attributinformationen zum ausgewählten Objekt ausgegeben.
Ein Objekt der Klasse "Polygon" speichert in diesem Beispiel viele Objekte der Klasse "Pair", welche die Polygonpunkte eines Polygons darstellen. Die Polygone selbst sind wiederum in einer ArrayList gespeichert. Somit ergibt sich eine Hierarchie von Objektcontainern, Objekten und abgeleiteten Objekten, die im MAT als "Dominator Tree" bezeichnet wird:

GUI_DominatorTree


View_OQL_Icon OQL ist eine eingebaute "Object Query Language", mit welcher sich im SQL-Stil Abfragen auf die Heap-Informationen schicken lassen.
Beispiel:

SELECT *
FROM de.fhwiesbaden.poly.Polygon

Über das Export-Symbol kann das Ergebnis auch im Format ".html", ".txt" bzw. ".csv" exportiert werden.

Folgendes Ergebnis erzielt z.B. der Export ins Textformat:


Class Name                              | Shallow Heap | Retained Heap | Retained Heap
--------------------------------------------------------------------------------------
                                        |              |               |
de.fhwiesbaden.poly.Polygon @ 0xb3b891a0|           24 |     5.957.400 |     5.957.400
de.fhwiesbaden.poly.Polygon @ 0xb3b76e30|           24 |         1.040 |         1.040
de.fhwiesbaden.poly.Polygon @ 0xb3b76a20|           24 |         1.040 |         1.040
de.fhwiesbaden.poly.Polygon @ 0xb3b5ef78|           24 |        97.496 |        97.496
Total: 4 entries                        |              |               |
--------------------------------------------------------------------------------------

View_SystemTest_Icon Mit dem "Expert System Test" lassen sich Reports im html-Format erstellen:

Die Reports werden als zip-Dateien im HeapDump-Ordner abgelegt und können später mit jedem beliebigen Web-Browser angezeigt werden.


View_QueryBrowser_Icon Der Query-Browser bietet einigen Shortcuts und Suchmöglichkeiten zur Anzeige spezieller Informationen und bietet dazu Such- und Eingabemasken und Optionen zur Auflistung und Gruppierung von Daten.

GUI_QueryBrowser

Da diese Funktionen aber weder im eingebauten Tutorial, noch irgendwo sonst dokumentiert sind, soll an dieser Stelle nicht weiter darauf eingegangen werden.


View_Find_Icon Hier kann nach Objekten in Form von hexadezimalen Objektadressen gesucht werden.


Detaillierte Beschreibung

Literatur

Keine gefunden.


Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite