2013-10-17 19 views
10

私はOutOfMemoryErrorを検出し、ヒープダンプを取って、自動的にJavaプログラムを終了したいと思います。私のJVM用に次のコマンドライン引数があるとします:Javaヒープダンプとシャットダウン - 何の順序?

-XX:OnOutOfMemoryError="kill -9 %p" 
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/tmp 

最初に起こるのはどちらですか?プロセスはメモリをダンプしてから終了しますか?

+0

キルをしないでください。トップレベルのtry-catchを持って、syste.exitを実行します。 –

答えて

6

私はむしろheapAndQuit.shは、現在のプロセスのpidを見つけるための方法を採用する

-XX:OnOutOfMemoryError="/<SomeStandardLocation>/heapAndQuit.sh" 

すなわち、より確定的順序付けを処理するスクリプトを呼び出すに頼っているでしょう。 PIDを識別するための 1つの簡単な方法は、私は、ダンプする jmapを使用します

lsof | grep /var/tmp/<yourlogfileName> | cut -d " " -f1 | uniq 

にあなたのプロセスが書き込みされるログファイルの場所を使用することで、その後kill -9のJavaバージョン8u92で

+0

これは私が代わりにやったことです、これまでのところ、はるかに拡張可能な選択肢と思われます。ありがとう! – theeggman85

+0

tomcatの場合、pidを見つけるより洗練された方法は 'TOMCATPID = $(cat tomcat.pid)'です。 – kubanczyk

1

これは、使用している実際のJVM実装に大きく依存すると思います。私は、使用中のJVMがインテリジェントな順序付けを採用していることを信じたいと思います。まず、マシンを殺すよりもヒープダンプを実行します。しかし、私の意見では、オプションの順序に頼るべきではありません。

7

OpenJDKを使用している場合は、-XX:OnOutOfMemoryErrorオプションで設定したコマンドを実行するときには必ず確認できます。

OpenJDKのソースコードから取得したコード。参照:debug.cpp

void report_java_out_of_memory(const char* message) { 
    static jint out_of_memory_reported = 0; 

    // A number of threads may attempt to report OutOfMemoryError at around the 
    // same time. To avoid dumping the heap or executing the data collection 
    // commands multiple times we just do it once when the first threads reports 
    // the error. 
    if (Atomic::cmpxchg(1, &out_of_memory_reported, 0) == 0) { 
    // create heap dump before OnOutOfMemoryError commands are executed 
    if (HeapDumpOnOutOfMemoryError) {  
     tty->print_cr("java.lang.OutOfMemoryError: %s", message); 
     HeapDumper::dump_heap_from_oome(); 
    } 

    if (OnOutOfMemoryError && OnOutOfMemoryError[0]) { 
     VMError err(message); 
     err.report_java_out_of_memory(); 
    } 
    } 
} 

念のため簡単な説明:すべてのチェックの

  1. まずHeapDumpOnOutOfMemoryErrorオプションが設定された場合。あなたはOpenJDKのを使用している場合OnOutOfMemoryErrorオプションが設定されたのであれば

)を実行report_java_out_of_memory(、Sencondly

  • )(dump_heap_from_oomeを実行している場合は、確かにあなたのプロセスは、メモリをダンプしてから終了します。

  • 2

    VM引数

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

    が追加されました。release notesを参照してください。

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

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

    機能拡張要求:JDK-8138745(パラメータの命名はJDK-8154713ExitOnOutOfMemoryError代わりのExitOnOutOfMemoryかかわらず間違っている)