Wir haben eine lange laufende Server-Anwendung, auf der Java 5 läuft, und wir können sehen, wie die alte Generation im Laufe der Zeit langsam wächst. Es ist korrekt auf einem vollständigen GC freigegeben, aber ich möchte in der Lage sein, die nicht erreichbaren Objekte in Eclipse MAT mit einem Heap-Dump zu sehen. Ich habe erfolgreich einen Heap-Dump mit + XX: HeapDumpOnCtrlBreak erhalten, aber die JVM macht immer einen GC vor dem Dumping der Heap. Anscheinend passiert dies nicht auf Java 6, aber wir stecken jetzt auf 5 fest. Gibt es eine Möglichkeit, dies zu verhindern?
Verwenden Sie jconsole oder visualvm oder jmc oder ... andere jmx-Verwaltungskonsole. Öffnen Sie HotSpotDiagnostic in com.sun.management. Wählen Sie die Methode dumpHeap und geben Sie zwei Parameter ein:
false
, um alle Objekte zu löschen. Beachten Sie, dass die Sicherungsdatei von der JVM geschrieben wird, mit der Sie verbunden sind, nicht von JVisualVM. Wenn die JVM also auf einem anderen System ausgeführt wird, wird sie auf dieses System geschrieben.
Haben Sie das Standard-Jmap-Tool ausprobiert, das mit dem JDK ausgeliefert wurde? Die jmap-Maut wurde offiziell in Java 5 eingeführt.
Beispiel-Befehlszeile: / java / bin / jmap -heap: format = b
Das Ergebnis kann mit dem Standard-jhat-Tool oder mit GUI-Anwendungen wie MAT bearbeitet werden.
Ich habe hier einen Code, der programmgesteuert einen Heap-Dump über JMX ausführen kann:
Link: JmxHeapDumper .java
Die Kommentare im Quellcode enthalten 2 Links zu Artikeln, die nützliche Informationen zum Ablegen von Heap-Dumps enthielten. Ich weiß es nicht genau, aber wenn Sie Glück haben, könnte der JMX-Ansatz vielleicht eine Möglichkeit haben, den GC zu vermeiden. Hoffe das hilft!
Tags und Links java garbage-collection heap-memory