2009-11-30 12 views
12

Ich brauche eine Möglichkeit, einen Heap-Dump aus der Anwendung anzufordern.Anforderung Java-Heap-Dump (Kern-Dump) aus der Anwendung

Begründung: Wenn ich auf einen bestimmten Fehlerzustand stoße, möchte ich einen Heapspeicher erstellen, damit ich sehen kann, was sich im Speicher abspielt.

Aber ich möchte dies automatisieren (Zum Beispiel, wenn ich feststelle, dass eine bestimmte Bedingung aufgetreten ist. Oder wenn ein Watchdog seine Pings nicht mehr bekommt. Wenn ein Test fehlschlägt). Daher brauche ich eine Möglichkeit, den Heap aus der Anwendung selbst zu entfernen. Ich kann es nicht mit den MX Beans Sachen finden. Obwohl die MX-Beans mit Monitor- und "ownable synchronizer" -Info, Deadlock- und Contention-Informationen sehr schöne Stack-Traces geben können, finde ich keinen Weg, einen Heap-Dump anzufordern. Gibt es einen solchen Weg? Oder auf irgendeine indirekte Weise, zum Beispiel, wie machen es diese JVisualVM-Dinge? Und man kann der JVM sagen, dass sie einen Core auf OutOfMemoryExceptions ablegen soll.

Antwort

16

Wenn es zu dump heap on OutOfMemoryError nicht genug ist, gibt es einen HotSpot-abhängigen Weg von programmatically dumping heap from Java applications, wenn das in Ordnung ist.

+0

Super, genau das, was ich gesucht habe, Danke! Ich finde es erstaunlich, dass ich diesen Blogeintrag während meines Googelns nicht gefunden habe. Unter sun.management gibt es offensichtlich viel Spaß! – stolsvik

+0

Noch ein Kommentar (zurück zu den Ideen im OP): Von Ihrem Link "Dump Heap auf OutOfMemoryError" kann ich lesen: "Der integrierte Heap-Dumper kann auch verwendet werden, um einen Snapshot des Heap bei zu anderen Zeiten. Dies geschieht mithilfe des jmap-Befehlszeilendienstprogramms oder der jconsole-Überwachungs- und Verwaltungskonsole. ". Diese Tools verwenden dann wahrscheinlich den proprietären MXBean, auf den sich der zweite Link bezieht? Ich finde es seltsam, dass die Standard-MX-Beans diese Methode dumpHeap (fileName, live) nicht haben. – stolsvik

+0

Art von nervig, ja, aber ich würde vermuten, dass, wenn es eine Standardfunktionalität wäre, das Heap-Dump-Format auch standardisiert werden sollte. Zumindest würde ich mir vorstellen, dass das eine Menge Arbeit wäre, und es könnte möglicherweise die Freiheit einschränken, die Anbieter in ihren VM-Implementierungen haben. – gustafc

4

Was ist mit der Verwendung der VM-Option -XX:+HeapDumpOnOutOfMemoryError, um der HotSpot-VM mitzuteilen, einen Heap-Dump zu generieren, wenn der Arbeitsspeicher knapp wird?

+0

+1: die einzige "spezifische Fehlerbedingung", bei der das OP vernünftigerweise wissen kann, dass etwas im Speicher steckt, ist ein OutOfMemoryError; In diesem Fall gibt der Dump-Heap an diesem Punkt den gewünschten Heap-Dump aus. –

+0

@Andrzej: Warum sollte das die einzige "vernünftige" Fehlerbedingung sein? Es gibt viele Möglichkeiten, um zu erkennen, wie die Speichersituation einer VM von innen her ist, z. WeakReference, Überprüfung der Speicherzähler von Runtime und MX Beans usw. (vor und nach System.gc()) - Bootloads. JProfiler rockt, aber ich wollte eine programmatische, nicht-JProfiler Lösung. Hier ist ein anderer Typ, dessen Problem ich nachvollziehen kann: http://www.velocityreviews.com/forums/t275440-dump-complete-java-vm-state-as-core-dump-not-via-os-possible.html I Wette, er hätte die Lösung, die ich hier bekommen habe, geliebt! – stolsvik

Verwandte Themen