Java : Holen Sie sich die heap-dump ohne jmap oder ohne Aufhängen des Programms
In wenigen Umstand, unsere Anwendung ist mit rund 12 GB Speicher.
Wir haben versucht, den heap-dump mit jmap-Dienstprogramm. Da die Anwendung ist mit einigen GB Speicher es bewirkt, dass die Anwendung nicht mehr reagiert und Ursachen problem in der Produktion.
In unserem Fall der heap-Verbrauch plötzlich steigt von 2-3 GB auf 12 GB in 6 Stunden. In einem Versuch zu finden, den Speicherverbrauch trend, den wir versuchten zu sammeln, die heap-dump, jede eine Stunde, nachdem die Anwendung neu zu starten. Aber wie gesagt, da mit der jmap bewirkt, dass die Anwendung hängen bleibt, die wir brauchen, um es neu zu starten und wir sind nicht in der Lage, den trend der Speichernutzung.
Ist es ein Weg, um die heap-dump ohne Aufhängen des Programms oder ist es ein Dienstprogramm andere als jmap zu sammeln heap-dump.
Gedanken zu diesem hoch geschätzt, da, ohne sich der trend der Speichernutzung ist es sehr schwierig, das Problem zu beheben.
Hinweis: Unsere Anwendung läuft in CentOS.
Dank,
Arun
InformationsquelleAutor Arun | 2013-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie die folgenden. Es kommt mit JDK >= 7:
Beispiel:
Diesen dumping-Prozess ist viel schneller als dumping mit jmap! Dumpfiles sind viel kleiner, aber es ist genug, um Ihr die Idee, wo die Lecks sind.
In der Zeit des Schreibens dieser Antwort, es gibt bugs mit Memory Analyzer und IBM HeapAnalyzer, dass Sie nicht Lesen können dumpfiles von jmap (jdk8, große Dateien). Sie können Yourkit zu Lesen diese Dateien.
InformationsquelleAutor Tim Long
Zuerst von allen, ist es (AFAIK) wesentlich für das einfrieren der JVM während ein thread dump /snapshot genommen wird. Wenn die JVM in der Lage war, weiterhin zu laufen, während der snapshot erstellt wurde, wäre es nahezu unmöglich ist, eine zusammenhängende Momentaufnahme.
So gibt es andere Möglichkeiten, um einen heap dump?
Kann man einen heap-dump mit VisualVM wie beschrieben hier.
Kann man einen heap-dump mit jconsole oder Eclipse Memory Analyser, wie beschrieben,hier.
Aber alle diese sind gebunden an die JVM (mindestens) pause.
Wenn Ihre Anwendung tatsächlich hängen (dauerhaft!) das klingt wie ein problem mit der Anwendung selbst. Mein Vorschlag wäre zu sehen, wenn Sie die Spur , dass problem, bevor Sie sich für das Speicher-Leck.
Mein anderer Vorschlag ist, dass man an einem einzigen heap-dump, und verwenden Sie die Statistiken, um herauszufinden, welche Art(en) des Objekts mit allen für den Raum ... und warum sind Sie erreichbar. Es gibt eine gute chance, dass Sie brauchen nicht die "trend" - Informationen an alle.
Ich bin darauf hindeutet, dass Sie einen einzigen heap-dump, und verwenden Sie die verfügbaren Werkzeuge zu 1) identifizieren Sie die größten oder häufigsten oder am meisten verdächtige Arten von Objekten, und dann 2) herauszufinden, wie / warum sind Sie erreichbar. Dies ist der normale Ansatz für die Suche nach Speicher-Lecks in Java.
InformationsquelleAutor Stephen C
Können Sie verwenden Sie GDB, um die heap-dump laufen, ohne jmap auf die Ziel-VM wird aber immer noch hängen die Anwendung, für die die benötigte Zeit zum schreiben der heap-dump auf die Festplatte. Vorausgesetzt, dass eine disk speed von 100MB/s (basic gespiegelten array oder eine Festplatte), diese noch 2 Minuten downtime.
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
Der einzig wahre Weg, um zu vermeiden, stoppen die JVM ist transactional memory und einen kernel, der nutzt es, um eine Prozess-snapshot-Anlage. Dies ist einer der Träume der Befürworter von STM, aber es ist noch nicht verfügbar. VMWare ' s hot-migration nahe kommt, aber hängt von Ihrer Zuordnung rate nicht überschreiten Netzwerk-Bandbreite, und es nicht speichern Schnappschüsse. Petition Sie auf hinzufügen, um es für Sie, es wäre ein nettes feature.
InformationsquelleAutor FooMan
Hinzufügen Stephen ' s Antworten, Sie können auch bewirken, einen heap-dump über eine API für die gängigsten JVM-Implementierungen:
InformationsquelleAutor Lolo
Einen heap-dump, analysiert, mit dem richtigen Werkzeug wird Ihnen sagen, genau das, was verbraucht der heap. Es ist das beste Werkzeug für das aufspüren von memory leaks. Allerdings sammeln ein heap-dump ist langsam, geschweige denn analysieren.
Mit wissen über die Funktionsweise der Anwendung, manchmal ein Histogramm ist genug, um Ihnen einen Anhaltspunkt, wo zu suchen für das problem. Zum Beispiel, wenn
MyClass$Inner
ist an der Spitze des Histogramms und dieMyClass$Inner
ist nur inMyClass
, dann wissen Sie genau, welche Datei zu suchen für ein problem.Hier ist der Befehl zum sammeln ein Histogramm.
jcmd
pidGC.class_histogram filename=histogram.txt
InformationsquelleAutor Nathan