Normalerweise ist das, was ich verwende, ParseHeapDump.sh
in Eclipse Memory Analyzer enthalten und hier beschrieben , und das mache ich auf einem unserer besser ausgebauten Server (Download und Kopieren über die Linux-ZIP-Distribution, dort entpacken). Das Shell-Skript benötigt weniger Ressourcen als das Parsen des Heapspeichers über die GUI. Außerdem können Sie es auf Ihrem bulligen Server mit mehr Ressourcen ausführen (Sie können mehr Ressourcen zuweisen, indem Sie beispielsweise -vmargs -Xmx40g -XX:-UseGCOverheadLimit
am Ende der letzten Zeile des Skripts etwas hinzufügen . Die letzte Zeile dieser Datei könnte nach der Änderung so aussehen
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
Führen Sie es wie ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
Danach wird eine Reihe von "Index" -Dateien neben der .hprof-Datei erstellt.
Nachdem ich die Indizes erstellt habe, versuche ich, daraus Berichte zu generieren und diese Berichte an meine lokalen Computer zu senden und zu prüfen, ob ich den Schuldigen nur dadurch finden kann (nicht nur die Berichte, nicht die Indizes). Hier ist ein Tutorial zum Erstellen der Berichte .
Beispielbericht:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Weitere Berichtsoptionen:
org.eclipse.mat.api:overview
und org.eclipse.mat.api:top_components
Wenn diese Berichte nicht ausreichen und ich noch etwas graben muss (z. B. über oql), scp ich die Indizes sowie die hprof-Datei auf meinem lokalen Computer und öffne dann den Heap-Dump (mit den Indizes im selben Verzeichnis wie) der Heap Dump) mit meiner Eclipse MAT GUI. Von dort benötigt es nicht zu viel Speicher, um ausgeführt zu werden.
EDIT:
Ich wollte nur zwei Notizen hinzufügen:
- Soweit ich weiß, ist nur die Generierung der Indizes der speicherintensive Teil von Eclipse MAT. Nachdem Sie die Indizes haben, würde der größte Teil Ihrer Verarbeitung von Eclipse MAT nicht so viel Speicher benötigen.
- Wenn ich dies in einem Shell-Skript mache, kann ich es auf einem Headless-Server machen (und normalerweise auch auf einem Headless-Server, weil sie normalerweise die leistungsstärksten sind). Und wenn Sie einen Server haben, der einen Heap-Dump dieser Größe generieren kann, haben Sie wahrscheinlich einen anderen Server, der auch so viel von einem Heap-Dump verarbeiten kann.
ArrayIndexOutOfBoundsException
Funktionen in mindestens zwei Bugs . Ich sage dies, weil Sie beim Ausführen von MAT, das einen anderen Fix hat, kein OOME gemeldet haben .