2

OutOfMemory大規模なJavaアプリケーションがあり、エラーが発生した場合は正常にシャットダウンしたいとします。今、私は次の問題を見ます:

  • Throwables一部のコンポーネントは、以下を含むすべてをキャッチして「飲み込む」OutOfMemory
  • スレッドがキャッチしない場合は終了し、それが発生したOutOfMemoryかどうかはわかりませんOutOfMemory

どういうわけか「JVMレベル」ハンドラーを登録OutOfMemoryして、JVMで発生する可能性のあるものをキャッチできますか?

4

3 に答える 3

3

一部のコンポーネントは、OutOfMemoryを含むすべてのThrowableをキャッチして「飲み込み」ます

彼らはそれをすべきではありません、私はそれらを修正します。

スレッドがOutOfMemoryをキャッチしない場合、スレッドは終了し、OutOfMemoryが発生したことはわかりません。

私も修正します。

UncaughtExceptionHandlerを登録できます。

唯一のオプションは、プログラムをシャットダウンするOOMEでスクリプトをトリガーすることかもしれません。これは、コマンドラインから実行できます。

于 2012-08-14T08:02:39.537 に答える
2

メモリ不足の問題はエラーです。これは、そこから正しいJVM状態を復元できないため、ファイナライズを実行できないことを意味します。代わりに、アプリケーションのメモリ消費量を監視し、空きメモリレベルが低くなりすぎる場合は、アプリケーションを正しくシャットダウンしてみてください(これが必要なことだと思います)。

于 2012-08-14T08:02:38.723 に答える
1

エラーをキャッチしないでください!だから、RTFM!;)

エラーは非常に奇妙なので、メインにスローしてVMを停止する必要があります。

例外はスロー可能であり、「処理」できます(SocketTimeoutException、NullpointerExceptionなど)。エラーは、(最も一般的なケースでは)処理できないスローアブルです。OutOfMemoryErrorがスローされた場合、どうしますか?実行時間でメモリを拡張できますか?ガベージコレクタは通常、OOMEがスローされる前に複数回実行されます。

したがって、特別な場合:OutOufMemoryError-Objectを作成して、VM-Deathの理由を確認するのに十分なメモリがあることを確認してください。

コードをリファクタリングしてください!;)

于 2012-08-14T09:46:32.837 に答える