Wie analysiere ich eine .hprof-Datei?

227

Ich habe einen Produktionsserver mit dem folgenden Flag: - XX: + HeapDumpOnOutOfMemoryError

Letzte Nacht wurde eine java-38942.hprof-Datei generiert, als auf unserem Server ein Heap-Fehler auftrat. Es stellt sich heraus, dass die Entwickler des Systems von der Flagge wussten, aber keine Möglichkeit hatten, nützliche Informationen daraus zu erhalten.

Irgendwelche Ideen?

Nick Stinemates
quelle

Antworten:

214

Wenn Sie möchten, dass ein ziemlich fortgeschrittenes Tool ernsthaft herumstochert, schauen Sie sich das Memory Analyzer-Projekt bei Eclipse an, das von SAP bereitgestellt wurde.

Einige Ihrer Möglichkeiten sind umwerfend gut, um Speicherlecks usw. zu finden - einschließlich der Ausführung einer Form von eingeschränktem SQL (OQL) für die speicherinternen Objekte, d. H.

SELECT toString (Vorname) FROM com.yourcompany.somepackage.User

Total genial.

Cowan
quelle
17
Ich möchte nur eine +100 für Eclipse Memory Analyzer hinzufügen. Ich versuche derzeit, eine Heap-Dump-Datei mit mehr als 400 MB zu durchsuchen, und es dauerte mehr als 70 Minuten, um die Datei zu lesen, bevor sie einen vollständigen JVM-Absturz verursachte. EMA kann es in <5 Minuten öffnen.
Matt B
3
Beim Öffnen von HPROF-Dateien mit dem Eclipse Memory Analyzer (die tatsächlich auch von Eclipse ausgegeben wurden!) Werden immer wieder Analysefehler angezeigt. Schade .. seufz.
lost_bits1110
3
MAT kann immer noch ziemlich viel RAM benötigen [weniger als JHAT, aber immer noch ziemlich viel]. Siehe stackoverflow.com/questions/7254017/... für Tipps , wenn Sie in das Geschehen laufen.
Rogerdpack
71

Sie können JHAT verwenden , das Java Heap Analysis Tool, das standardmäßig mit dem JDK bereitgestellt wird. Es ist eine Befehlszeile, startet jedoch einen Webserver / Browser, mit dem Sie den Speicher untersuchen. Nicht besonders benutzerfreundlich, aber zumindest ist es an den meisten Orten, an denen Sie unterwegs sind, bereits installiert. Eine sehr nützliche Ansicht ist der Link "Heap-Histogramm" ganz unten.

Ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat kann "heutzutage" auch OQL ausführen (unterer Link "OQL ausführen")

CMS
quelle
Nachdem Sie den obigen Befehl ausgeführt haben, erhalten Sie in der Konsole die Meldung im Terminal "Server ist bereit" Port: 7401. Öffnen Sie anschließend diese URL: localhost: 7401 "Sie können Details in den Browserfenstern sehen".
Laxman G
35

Sie können HeapWalker auch über den Netbeans Profiler oder das eigenständige Visual VM -Tool verwenden. Visual VM ist eine gute Alternative zu JHAT, da es eigenständig ist, aber viel einfacher zu verwenden ist als JHAT.

Sie benötigen Java 6+, um Visual VM vollständig nutzen zu können.

James Schek
quelle
Sie sollten einen Hinweis hinzufügen, dass dies nur für Java 6 und 7 gilt.
Nick Stinemates
AFAIK, HeapWalker und VisualVM benötigen kein Java 6/7 zum Lesen von HPROF-Dateien.
James Schek
Ich habe gerade versucht, es mit Java 5 zu laden und es stand 'Bitte benutze Java 6 oder 7'. Was mache ich falsch?
Nick Stinemates
Hmm. Vielleicht müssen Sie Java 6 ausführen, können aber ein Java 5 HPROF lesen (vielleicht habe ich es so zum Laufen gebracht). Ich weiß, dass Sie mit einer App unter Java 5 keinen Heap-Dump von Visual VM erstellen können. Wird aktualisiert.
James Schek
Sie können auch visuelle JVM von Java SDK - Look jvisualvm.exeat JAVASDK/binOrdner
xxxvodnikxxx
11

Holen Sie sich einfach den Eclipse Memory Analyzer . Es gibt nichts Besseres da draußen und es ist kostenlos.

JHAT kann nur für "Spielzeuganwendungen" verwendet werden.

kohlerm
quelle
3
JHAT ist notwendig, um die "l33t" -Hacker zu beeindrucken, die eine BSD-Distribution von Hand erstellen, beginnend mit dem LILO. Warten Sie ... sie würden sowieso nie Java verwenden. :-)
James Schek
Ich denke, das ist eher ein Kommentar ...: \
Rogerdpack
10

YourKit Java Profiler scheint auch damit umzugehen.

Polaris
quelle
5

Wenn Sie eine benutzerdefinierte Analyse Ihres Heapdumps durchführen möchten, gibt es:

Diese Bibliothek ist schnell, aber Sie müssen Ihren Analysecode in Java schreiben.

Aus den Dokumenten:

  • Erstellt keine temporären Dateien auf der Festplatte, um den Heap-Dump zu verarbeiten
  • Kann direkt mit GZ komprimierten Heap-Dumps arbeiten
  • HeapPath-Notation
Andrejs
quelle
2

Ich persönlich bevorzuge VisualVM. Eine der Funktionen, die ich in VisualVM mag, ist der Heap-Dump-Vergleich. Wenn Sie eine Heap-Dump-Analyse durchführen, gibt es verschiedene Möglichkeiten, um herauszufinden, was den Absturz verursacht hat. Eine der Möglichkeiten, die ich als nützlich empfunden habe, ist der Vergleich von gesunden und ungesunden Heap-Dumps.

Die folgenden Schritte können Sie ausführen:

  1. Wenn wir einen Heap-Dump von OutOfMemoryError erhalten, nennen wir ihn "oome.hprof". Sie können dies über den JVM-Parameter HeapDumpOnOutOfMemoryError abrufen.
  2. Starten Sie die Anwendung neu und lassen Sie sie je nach Anwendung lange (Minuten / Stunden) laufen. Holen Sie sich einen weiteren Heap-Dump, während die Anwendung noch ausgeführt wird. Nennen wir es "gesund.hprof".
  3. Sie können beide Dumps in VisualVM öffnen und einen Heap-Dump-Vergleich durchführen. Sie können dies auf Klassen- oder Paketebene tun. Dies kann Sie oft in die Richtung des Problems weisen.

Link: https://visualvm.github.io

Waleed
quelle