Verwenden des HeapDumpOnOutOfMemoryError-Parameters für den Heap-Dump für JBoss

182

Mir wurde gesagt, dass ich den -XX:+HeapDumpOnOutOfMemoryErrorParameter zu meinen JVM-Startoptionen zu meinem JBoss-Startskript hinzufügen kann , um einen Heap-Dump zu erhalten, wenn in unserer Anwendung ein Speicherfehler auftritt. Ich habe mich gefragt, wo diese Daten gespeichert werden. Geht es nur um die Konsole oder um eine Protokolldatei? Was passiert, wenn ich nicht über die Konsole beim Unix-Server angemeldet bin?

Dmitry Trunov
quelle
1
Das ist der aktuelle Ordner, denke ich.
Valentin Tihomirov

Antworten:

246

In der Dokumentation von Oracle heißt es:

Standardmässig ist der Heapdump in einer Datei erstellt namens java_ pid .hprof im Arbeitsverzeichnis der VM, wie im Beispiel oben. Mit der -XX:HeapDumpPath=Option können Sie einen alternativen Dateinamen oder ein alternatives Verzeichnis angeben . Beispielsweise -XX:HeapDumpPath=/disk2/dumps wird der Heap-Dump im /disk2/dumps Verzeichnis generiert .

Matt Solnit
quelle
16
Hier werden auch alle Optionen zur VM-Leistung aufgelistet
Ravi Gupta
4
Wichtig! Die HeapDump-Flags sind nur in Java 1.5.0_07 verfügbar.
Rustyx
14
Es ist auch wichtig zu erkennen, dass die JVM einen vorhandenen Heap-Dump NICHT überschreibt. HeapDumpPathSie werden etwas Ähnliches wie "Unable to create /tmp/java_pidpid.hprof: File exists"in Ihrem Standard-Out sehen. Stellen Sie sicher, dass Sie Ihre Dump-Datei aus dem Dump-Pfad verschieben, um den Weg für zukünftige Dump-Dateien freizumachen. Verwenden Sie den <pid>Platzhalter im Dateinamen, um die Entropie im Dateinamen zu erhöhen.
Ben
1
Es war äußerst nützlich. Es dauerte nur wenige Minuten, um das Leck mit Eclipse Memory Analyzer zu finden.
Aron Lorincz
Was passiert, wenn wir einen Pfad zu einem Ordner angeben, der nicht im System vorhanden ist? Wird ein Ordner erstellt und der Buckel-Dump in diesen Ordner verschoben?
Vinit89
47

Sie können diesen Speicherauszug über die UNIX-Konsole anzeigen.

Der Pfad für den Heap-Dump wird direkt nach dem Platzieren der genannten Variablen als Variable bereitgestellt.

Z.B:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

Sie können den Speicherauszug von der Konsole aus auf dem angegebenen Pfad anzeigen.

Swaminathan Krishnamoorthi
quelle
4

Es fiel mir schwer zu entschlüsseln, was unter "Arbeitsverzeichnis der VM" zu verstehen ist. In meinem Beispiel habe ich das Java Service Wrapper-Programm verwendet, um ein JAR auszuführen. Die Dump-Dateien wurden in dem Verzeichnis erstellt, in dem ich das Wrapper-Programm abgelegt hatte, z. B. c: \ myapp \ bin. Der Grund, warum ich dies entdeckt habe, ist, dass die Dateien sehr groß sein können und die Festplatte gefüllt haben, bevor ich ihren Speicherort entdeckt habe.

B5A7
quelle
Ihr Arbeitsverzeichnis finden Sie über den Befehl pwdx <PID>. Mach zuerst ein ps -ef | grep java, finde deine PID für deine Java-App und führe dann pwdx <PID> aus. Es wird Ihnen das Arbeitsverzeichnis mitteilen.
RCG
2

Wenn Sie die Option "-XX: HeapDumpPath" nicht verwenden, wird bei JBoss EAP / As standardmäßig die Heap-Dump-Datei im Verzeichnis "JBOSS_HOME / bin" generiert.

Swapnil Chaudhari
quelle