Tool zum Analysieren großer Java-Heap-Dumps
Ich habe einen HotSpot JVM-heap-dump, den ich analysieren. Die VM lief mit -Xmx31g
, und die heap-dump-Datei ist 48 GB groß.
- Ich werde nicht einmal versuchen
jhat
, als es erfordert etwa fünf mal die heap-Speicher (240 GB in meinem Fall) und ist furchtbar langsam. - Eclipse MATTE stürzt mit einem
ArrayIndexOutOfBoundsException
nach der Analyse der heap-dump für mehrere Stunden.
Welche anderen tools gibt es für die Aufgabe? Eine suite von Befehlszeilen-tools, das beste wäre, die aus einem Programm, das wandelt die heap-dump in effiziente Datenstrukturen für Analyse, kombiniert mit einigen anderen tools, die Arbeit an der pre-strukturierten Daten.
Kommentar zu dem Problem - Öffnen
Sind Sie sicher, dass der dump ist nicht beschädigt und dass Sie mit einer neueren version von der DTFJ-Gläser? Die
ArrayIndexOutOfBoundsException
- Funktionen in atleast zwei bugs. Ich bin besagt dies, weil Sie sich nicht gemeldet haben ein OOME beim laufen-MATTE, die hat einen anderen fix. jhat verwendet heapMap zum speichern der Objekte Lesen, die wächst exponentiell mit der Anzahl der Objekte im heap gespeichert. Eine Möglichkeit ist die änderung der decl ' s aus heapMap, TreeMap, und führen Sie die heap-Größe der jhat mindestens so groß ist wie der Prozess.
InformationsquelleAutor der Frage Roland Illig | 2011-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Regel, was ich benutze, ist
ParseHeapDump.sh
innerhalb Eclipse Memory Analyzer und beschrieben hier, und ich weiß, dass auf einem unserer mehr aufgepeppt-Server (herunterladen und kopieren über die linux .zip-Distribution, entpacken Sie es). Das shell-Skript braucht weniger Ressourcen als die Analyse der heap von der GUI, und Sie können führen Sie es auf Ihrem Bulligen server mit mehr Ressourcen (Sie können die Zuweisung von mehr Ressourcen durch das hinzufügen von etwas wie-vmargs -Xmx40g -XX:-UseGCOverheadLimit
an das Ende der letzten Zeile des Skripts.Zum Beispiel die Letzte Zeile der Datei könnte Aussehen wie dieser nach änderung
Führen Sie es wie
./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
Nachdem das gelingt, schafft es eine Reihe von "index" - Dateien neben der .hprof-Datei.
Nach der Erstellung der Indizes, ich versuche, um Berichte zu generieren aus, und der scp diese Berichte auf meinem lokalen Rechner und versuchen zu sehen, ob ich finden kann, dass der Täter nur durch die (nicht nur die Berichte, nicht die Indizes). Hier ist ein tutorial auf erstellen der Berichte.
Beispiel-report:
Andere Optionen:
org.eclipse.mat.api:overview
undorg.eclipse.mat.api:top_components
Wenn diese Berichte sind nicht genug, und wenn ich brauche etwas mehr Graben (also sagen wir mal über oql), die ich mit scp die Indizes sowie hprof-Datei auf meiner lokalen Maschine, und öffnen Sie dann die heap-dump (mit den Indizes in dem gleichen Verzeichnis wie die heap-dump) mit meinem Eclipse MAT-GUI. Von dort aus braucht es nicht zu viel Speicher zu laufen.
EDIT:
Ich mochte hinzufügen, zwei Hinweise :
InformationsquelleAutor der Antwort Franz See
Akzeptierte Antwort auf diese Fragen sollte ein guter start für Sie (mit live-jmap Histogramme anstelle von heap-dumps):
Methode zum Auffinden von Speicher-Lecks in großen Java-heap-dumps
Meisten anderen heap-Auswerter (ich verwende den IBM -http://www.alphaworks.ibm.com/tech/heapanalyzer), benötigen Sie mindestens ein Prozentsatz von RAM mehr als die heap-wenn Sie erwarten, ein nettes GUI-tool.
Anderes, als dass viele Entwickler verwenden Sie alternative Ansätze, wie die live-stack-Analyse, um zu erhalten eine Idee von, was Los ist.
Obwohl ich in Frage stellen muss, warum Ihr Haufen so groß ist? Die Wirkung auf die Allokation und garbage collection muss Massiv sein. Ich Wette ein großer Prozentsatz von dem, was in Ihrem Haufen sollten eigentlich gespeichert werden in einer Datenbank /einem persistenten cache etc etc.
InformationsquelleAutor der Antwort Mikaveli
Schlage ich vor, Sie versuchen YourKit. Es muss in der Regel etwas weniger Speicher als der heap-dump-Größe (es-Indizes und verwendet diese Informationen zum abrufen, was Sie wollen)
InformationsquelleAutor der Antwort Peter Lawrey
Ein paar mehr Optionen:
Diese person http://blog.ragozin.info/2015/02/programatic-heapdump-analysis.html
schrieb eine benutzerdefinierte Netbeans heap analyzer, der nur macht ein "Abfrage-style" - Schnittstelle, über die der heap-dump-Datei, statt Sie tatsächlich zu laden der Datei in den Speicher.
https://github.com/aragozin/jvm-tools/tree/master/hprof-heap
Obwohl ich nicht weiß, wenn "seine query language" ist besser als die eclipse-OQL erwähnt in der akzeptierten Antwort hier.
JProfiler 8.1 ($499 für user-Lizenz) ist auch sagte in der Lage sein, um die traverse großen Haufen, ohne eine Menge Geld.
InformationsquelleAutor der Antwort rogerdpack
Einer nicht so gut bekannten Werkzeug - http://dr-brenschede.de/bheapsampler/ funktioniert gut für große Haufen. Es funktioniert durch die Probenahme, damit es nicht zu Lesen die ganze Sache, wenn auch ein wenig pingelig.
InformationsquelleAutor der Antwort Ashwin Jayaprakash
Im Falle der Verwendung von MATTE auf dem MAC (OSX) müssen Sie die Datei MemoryAnalyzer.ini-Datei in MemoryAnalyzer.app/Contents/MacOS. Es war nicht für mich arbeiten. Sie können erstellen eine modifizierte Start-Befehl/shell-Skript, basierend auf dem Inhalt dieser Datei und führen Sie Sie aus diesem Verzeichnis. In meinem Fall wollte ich eine 20 GB-heap:
Führen Sie einfach diesen Befehl/script aus Contents/MacOS Verzeichnis über das terminal zu starten, die GUI mit mehr RAM zur Verfügung.
InformationsquelleAutor der Antwort Michael Shvets