私は -XX:+HeapDumpOnOutOfMemoryError
JVMパラメータ。私も知っています -XX:OnOutOfMemoryError="cmd args;cmd args"
そしてそのkill -3 <JVM_PID>
はヒープダンプを要求します。
質問:OutOfMemoryError
で、最初に完全なヒープダンプを作成し、を確認するにはどうすればよいですか。次にダンプが完了した後、強制的に再起動(または強制終了)しますか?私の最善の策です-XX:OnOutOfMemoryError="kill -3 %p;sleep <time-it-takes-to-dump>;kill -9 %p"
?
Java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp
JVMは最初にヒープをダンプしてから、OnOutOfMemoryErrorコマンドを実行します (proof) 。
シャットダウンしたいだけの場合は、次のパラメータのいずれかを使用できます。
-XX:+ExitOnOutOfMemoryError
-XX:+CrashOnOutOfMemoryError
VM引数はJavaバージョン8u92で追加されました。 リリースノート を参照してください。
ExitOnOutOfMemoryError
このオプションを有効にすると、JVMはメモリ不足エラーが最初に発生したときに終了します。メモリ不足エラーを処理するのではなく、JVMのインスタンスを再起動したい場合に使用できます。CrashOnOutOfMemoryError
このオプションが有効になっている場合、メモリ不足エラーが発生すると、JVMがクラッシュし、テキストおよびバイナリのクラッシュファイルが生成されます。
拡張リクエスト: JDK-8138745 (パラメータの命名は間違っていますが JDK-815471 、ExitOnOutOfMemoryError
ではなくExitOnOutOfMemory
)
ランタイムがクラッシュ時に特定のエラーレベルを設定するに違いありません。その戻りコードを確認し、その場合はプログラムを再実行してください。おそらくそれをスクリプトに入れる必要があります。
Sun jreを使用すると、oomeにダンプをヒープできます。おそらくopenjdkもそうです。