2016-08-25 28 views
0

我々はOutOfMemoryErrorを記録するJVMのグローバルステータス?

catch(Throwable e) {log.error("some message", e)} 

を行いますが、それ以外の問題を無視するクラスライブラリに対処する必要があります。 https://stackoverflow.com/a/3878199/2954288で説明されているような外部コマンドを実行する以外に、起動時からOutOfMemoryErrorが発生したかどうかを調べるためにJVMに内部グローバル状態があるのでしょうか?

私の質問は、Is it a bad practice to catch Throwable?の複製ではありません。私は かどうか尋ねていません。catch(Throwable)です。私はそれに対処する特定の方法が存在するかどうか尋ねています。

+0

私の経験則は、実際にはうまく動作していないように見えるかもしれないので、「OOMEをスローしたJVMを信頼しない」ということです。それを再起動するには、外部コマンドが必要です。 –

+2

@ piet.t別のことについて:「Throwable」を呑むライブラリを信頼しないでください。他の狂気がそこにあるのを誰が知っている... –

+0

正確に。それにもかかわらず、私は少なくとも、出る前に最後の印を付けようとしています。 – Harald

答えて

0

キャッチOutOfMemoryError可能なすべての場所のパスにあります。実際には、どのJavaコードでも、JVM内で発生する可能性はありません。

JVMがOOMEを発行するときに回復可能ですが、通常は回復できない場合がありますので、JVMを使用できなくなるため、通常はあなたの内部にキャッチすることはありません(処理できない状態ですプログラム内の任意のステップ)

アプリケーションがOOMEを生成するかどうかを知る必要がある場合は、これを外部ポイントから実行する必要があります。これを実行する最も簡単な方法は、標準を使用することですJVMはいくつかのjvm起動オプションを使用して提供します。

通常、OOMEに対処するためのあなたの次のJVM起動オプションを使用します。あなたはそれをさらに分析できるように

  • -XX:+HeapDumpOnOutOfMemoryErrorがOOME上のヒープ・ダンプを生成するために、JVMに指示します(EclipseのMATと、たとえば:http://www.eclipse.org/mat/を)
  • -XX:OnOutOfMemoryError="<cmd args>;<cmd args>"は、OOMEの場合にホスト上でコマンドを起動するようにJVMに指示します。これにより、たとえば、電子メールを送信してサーバーを再起動することができます。 statupオプションの

詳しい情報はここで見つけることがCA:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

+0

これらのフラグはJVMに* all * OOMEs、またはキャッチされていないものだけを実行させますか? –

+0

私はそれをキャッチした後ではない、とにかくできないから。私は、JVM内に、悪いことが起こった後に私に教えるフラグがあるかどうか疑問に思います。 – Harald

+0

それで、私はあなたに2つの有用なフラグを与えます;)JVMがもうメモリを持たないため、OOMEの原因に関する診断データを記録することができないため、他に何かがあるとは思いません。方法はダンプを生成し、私の答えで示唆したようにそれを分析することです。 – loicmathieu

1

はOutOfMemoryErrorのは、起動

以来起こっているかどうかを確認 に照会することができますJVMにおけるいくつかの内部グローバルな状態があります

はい、変数out_of_memory_reportedがあります。 内部であり、外部から読み取られることは想定されていません。けれどもあなたは、たとえば、gdbでこれを行うことができます。

$ gdb -p PID 

(gdb) p 'report_java_out_of_memory(char const*)::out_of_memory_reported' 
$1 = 0 

あなたは彼らがキャッチされているかどうか、Javaアプリケーション内からすべてのOutOfMemoryErrorsを傍受する信頼性の高い方法を希望する場合は、JVMTI Exception Callbackを使用することができます。 例はhereです。