Java Out of memory automatische heap-dump-Datei-name
Ich habe mehrere Java-Prozesse, und ich bin versucht zu verwalten heap-dumps erstellt, wenn der OOM-Fehler auftreten. Wenn ich sage, verwalten, ich meine
- Namen der heap-dump unterschiedlich, basierend auf dem ursprünglichen Prozess -
- löschen, die älter heap-dumps zur Einsparung von Speicherplatz
Wenn dumping-heap auf OOM mit
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
die JVM erzeugt eine Datei mit dem folgenden Namen java_pidXXXX.hprof im angegebenen Ordner /tmp (wo XXXX ist die PID des Prozesses).
Gibt es trotzdem, um Sie ein anderes format angeben, wo die PID und das DATUM werden verwendet, um den Dateinamen zu erstellen?
Nach googeln für eine Stunde habe ich versucht myPrefix_$, {pid}, "date" ..usw.
Die einzigen zwei Dinge, die funktionieren sind
- nicht den Dateinamen angeben und Sie bekommen java_pidXXXX.hprof
- geben Sie eine statische Datei, name z.B. " \tmp\OOM.hprof.
wenn der \tmp Ordner nicht vorhanden ist wird Sie nicht erstellt, noch die heap-dump erzeugt wird.
Die eine Idee, die verwenden könnte, ist das hinzufügen eines Befehls auf OOM Fehler
-XX:OnOutOfMemoryError="doSomething.sh %p"
aber ich habe versucht, es zu vermeiden, da muss ich bereitstellen "doSomething.sh"
InformationsquelleAutor Dan M | 2015-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
-XX:HeapDumpPath
auf der Kommandozeile nicht geben Ihnen mehr Flexibilität als das, was Sie schon entdeckt haben. Das heißt, Sie können entweder:java_pidXXX.hprof
werden in diesem Verzeichnis erstellt werden.Den jeweiligen code in der HotSpot-Quelle ist heapDumper.cpp. Lesen Sie es, es sieht nicht für alle "magic-Sequenzen" in der gegebenen Pfad:
Das ist es. Kein parsing der Weg über die Bestimmung, ob es ein Verzeichnis ist oder nicht.
Nur die Flexibilität, die Sie können, um es hinzuzufügen, ist die Verwendung der shell-Fähigkeiten beim konstruieren Sie den Namen auf der Kommandozeile. Deswegen können Sie einige Beispiele sehen Sie auf dem web, die so etwas wie
name_`date`.ext
- diese werden von der shell ersetzt`date`
mit dem aktuellen Datum einmal. Das heißt, der Dateiname wird immer mit Datum/Zeit, wenn die shell verarbeitet den Befehl und begann mit der JVM - nicht das Datum/die Zeit, wenn der dump erstellt wurde. Wenn das gut genug für Sie ist - können Sie diese verwenden. Beachten Sie, dass es heutzutage mehr als akzeptabel, verwenden Sie die syntaxname_$(date).ext
.Wenn Sie nur das Datum, um in der Lage, alte Dateien zu entfernen, dann können Sie entfernen Sie in der Datei das Letzte änderungsdatum (die Unix/Linux-Programm
find
können Ihnen dabei helfen). Es gibt keine Notwendigkeit, um das Datum in den Namen.Den
$(date)
(oder`date`
) trick hilft Ihnen nicht mit der PID. Die Schale kann auch ersetzen die aktuelle PID, wenn Sie$$
- aber es ist die PID des shell verarbeitet den Befehl Linie, nicht die JVM-Prozess selbst. Jedoch, wenn Sie starten Sie Ihren JAVA-Anwendung mittels shell -exec
Befehl erhält es den gleichen Prozess-ID wie die shell-es stammt aus, so dass Sie tatsächlich nutzen können$$
zu bauen, die Ihr mit dem Namen. Denken Sie jedoch daran, dass nichts nachexec
ausgeführt werden, die von Ihrem Skript.So können Sie versuchen, das dynamische ändern Sie den Namen der Datei, die @apangin schlug in seiner Antwort. Beachten Sie jedoch, dass es wahrscheinlich ein wenig schwierig zu sagen, die Zeit der dump selbst, wie Sie ll wollen, um die Datei-Namen festgelegt werden, bevor die OOM tatsächlich passiert.
InformationsquelleAutor RealSkeptic
HeapDumpPath
ist ein überschaubarer VM-option. Dies bedeutet, dass Sie können, was Sie wollen in der runtime mit JMX.InformationsquelleAutor apangin