OutOfMemoryError
私はいつもJVMを再起動すると思っていました。
しかし、OutOfMemoryError
これが発生する動作がコードから検出されず(実際には、これが可能かどうかさえわかりません)
、JVM
続行します(ただし、コアダンプが生成されます)。
誰かが私がこの振る舞いを理解するのを手伝ってもらえますか?
5 に答える
OutOfMemoryError
他と同じように例外です。確かにJVMを再起動しません。発生したスレッドが終了する可能性がありますが、それはどこにも引っ掛からない場合にのみ発生します。おそらく表示されるのはコアダンプではなく、キャッチされた例外のスタックトレースと、を使用して明示的に出力されたスタックトレースe.printStackTrace()
です。
OutOfMemoryErrorは、メモリ割り当てが失敗したことを1つのスレッドに報告します。
int count = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
try {
long[] longs = new long[Integer.MAX_VALUE];
} catch (OutOfMemoryError e) {
count++;
}
}
long time = System.currentTimeMillis() - start;
System.out.printf("Got %,d OutOfMemoryErrors in %.1f seconds%n", count, time/1e3);
プリント
Got 10,000,000 OutOfMemoryErrors in 3.9 seconds
OutOfMemoryErrorまたは例外は、JVMを再起動しません。
OutOfMemoryErrorが発生する動作が見られますが、これはコードからキャッチされません
----> OutOfMemoryErrorはを継承しjava.lang.Error
ます。エラーは、コンピュータのメモリが不足するなど、まれにしか回復できない、または回復が難しい環境問題を表します。Errorクラスオブジェクトを処理することは期待されていませんが、。を使用して処理する必要がありますThrowable
。これらは環境上の欠陥と見なされるべきです。
例外階層をご覧ください。
OutOfMemoryは、使用可能なメモリが不足しているためにオブジェクトをインスタンス化できなかった場合にスローされる単なるエラーです。これは、他の例外やエラーが停止しないように、JVMを停止しません。
ThrowableはJVMを再起動しません。OutOfMemoryErrorは、他のすべてのランタイム例外またはエラーと同様です。キャッチされるまで、呼び出しスタックを伝播します。そうでない場合は、スレッドのUncaughtExceptionHandlerがこの例外を処理します。通常は、スレッドを終了して、例外のスタックトレースを出力します。