メモリ不足の例外が発生したかどうかを検出する方法をシステムに提供したいと思います。この演習の目的は、JMXを介してこのフラグを公開し、それに応じて動作することです(たとえば、監視システムに関連するアラートを構成することによって)。そうでない場合、これらのエラーは何日も気付かれません。
このための単純なアプローチは、すべてのスレッドにキャッチされない例外ハンドラーOutOfMemoryError
を設定し、発生した例外がインスタンスであるかどうかを確認し、関連するフラグを設定することです。ただし、次の理由により、このアプローチは現実的ではありません。
- 例外は、サードパーティのライブラリを含め、どこでも発生する可能性があります。
Throwable
彼らがそれを捕まえて自分たちのために保つのを防ぐために私ができることは何もありません。 - ライブラリは独自のスレッドを生成する可能性があり、これらのスレッドに対してキャッチされない例外ハンドラーを強制する方法はありません。
私が目にする可能性のあるシナリオの1つは、バイトコード操作(たとえば、ある種のアスペクトを上に付加するOutOfMemoryError
)ですが、それが正しいアプローチであるかどうか、またはこれが一般的に実行可能かどうかはわかりません。
有効に-XX:+HeapDumpOnOutOfMemoryError
しましたが、これは他の目的で設計されているため、この問題の解決策とは見なされません。これが発生した場合、Javaコールバックは提供されません。
誰かがこれをしましたか?どのように解決しますか、それとも解決を提案しますか?どんなアイデアでも大歓迎です。