web-dev-qa-db-ja.com

ヒープダンプを作成した後、OutOfMemoryErrorでJVMを再起動するにはどうすればよいですか?

私は -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"

15
Ztyx
Java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp

JVMは最初にヒープをダンプしてから、OnOutOfMemoryErrorコマンドを実行します (proof)

22
apangin

シャットダウンしたいだけの場合は、次のパラメータのいずれかを使用できます。

  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError

VM引数はJavaバージョン8u92で追加されました。 リリースノート を参照してください。

ExitOnOutOfMemoryError
このオプションを有効にすると、JVMはメモリ不足エラーが最初に発生したときに終了します。メモリ不足エラーを処理するのではなく、JVMのインスタンスを再起動したい場合に使用できます。

CrashOnOutOfMemoryError
このオプションが有効になっている場合、メモリ不足エラーが発生すると、JVMがクラッシュし、テキストおよびバイナリのクラッシュファイルが生成されます。

拡張リクエスト: JDK-8138745 (パラメータの命名は間違っていますが JDK-815471ExitOnOutOfMemoryErrorではなくExitOnOutOfMemory

13
flavio.donze

ランタイムがクラッシュ時に特定のエラーレベルを設定するに違いありません。その戻りコードを確認し、その場合はプログラムを再実行してください。おそらくそれをスクリプトに入れる必要があります。

Sun jreを使用すると、oomeにダンプをヒープできます。おそらくopenjdkもそうです。

0
Marged