15

メモリ不足の例外が発生したかどうかを検出する方法をシステムに提供したいと思います。この演習の目的は、JMXを介してこのフラグを公開し、それに応じて動作することです(たとえば、監視システムに関連するアラートを構成することによって)。そうでない場合、これらのエラーは何日も気付かれません。

このための単純なアプローチは、すべてのスレッドにキャッチされない例外ハンドラーOutOfMemoryErrorを設定し、発生した例外がインスタンスであるかどうかを確認し、関連するフラグを設定することです。ただし、次の理由により、このアプローチは現実的ではありません。

  • 例外は、サードパーティのライブラリを含め、どこでも発生する可能性があります。Throwable彼らがそれを捕まえて自分たちのために保つのを防ぐために私ができることは何もありません。
  • ライブラリは独自のスレッドを生成する可能性があり、これらのスレッドに対してキャッチされない例外ハンドラーを強制する方法はありません。

私が目にする可能性のあるシナリオの1つは、バイトコード操作(たとえば、ある種のアスペクトを上に付加するOutOfMemoryError)ですが、それが正しいアプローチであるかどうか、またはこれが一般的に実行可能かどうかはわかりません。

有効に-XX:+HeapDumpOnOutOfMemoryErrorしましたが、これは他の目的で設計されているため、この問題の解決策とは見なされません。これが発生した場合、Javaコールバックは提供されません。

誰かがこれをしましたか?どのように解決しますか、それとも解決を提案しますか?どんなアイデアでも大歓迎です。

4

4 に答える 4

6

メモリ不足警告システムを使用できます。このhttp://www.javaspecialists.eu/archive/Issue092.htmlはインスピレーションになる可能性があります。特定のメモリしきい値 (80% など) に違反した後に呼び出されるリスナーを構成できます。この呼び出しを使用して、是正措置を開始できます。

コンポーネントのメモリしきい値が 80% に達したときにコンポーネントのサービスを一時停止し、クリーンアップ アクションを開始する、同様の方法を使用します。コンポーネントは、使用メモリが別の構成可能な値のしきい値を下回った場合にのみ元に戻ります。

于 2012-07-16T18:12:16.577 に答える
3

Scorpion が既にリンクを提供している投稿に基づく記事があります。

この手法も、MemoryPoolMXBean の使用と「メモリしきい値超過」イベントへのサブスクライブに基づいていますが、元の投稿で説明したものとは少し異なります。

著者は、単純な「メモリしきい値を超えました」イベントをサブスクライブすると、「誤報」の可能性があると述べています。メモリ消費量がしきい値を超えているが、すぐにガベージ コレクションが実行され、その後多くのメモリが解放される状況を想像してみてください。実際、そのような状況は、実際のアプリケーションでは非常に一般的です。

幸いなことに、別のしきい値「コレクション使用率しきい値」と、ガベージ コレクションの直後にメモリ消費量に基づいて発生する対応するイベントがあります。そのイベントを受け取ると、メモリが不足していることをより確信できます。

于 2015-01-07T10:04:57.170 に答える
0

静的なものを使用して、キャッチされなかったすべての例外をキャッチできますThread.setDefaultUncaughtExceptionHandler. 。もちろん、誰かがすべてのThrowableをキャッチしている場合は役に立ちません。(OOMEを使用すると、問題のあるtryブロックの外側の何かが爆発するまでカスケード効果が得られると思いますが、何も起こらないと思います。)スレッドが例外ハンドラーが機能するのに十分なメモリを解放したことを願っています。OOMエラーは、対処しようとすると増加する傾向があります。

于 2012-07-16T19:17:41.127 に答える
0

-XX:+HeapDumpOnOutOfMemoryError を有効にしていますが、これは別の目的のために設計されたものであるため、この問題の解決策とは思えません。これが発生した場合、Java コールバックは提供されません。

このフラグだけで十分です。結果のヒープ ダンプ ファイルの出力ディレクトリを、定期的に確認する既知の場所に設定します。コールバックがあっても役に立ちません。メモリが不足している場合、コールバック コードを実行するのに十分なメモリがあることを保証できません! できることは、データを収集し、外部プログラムを使用してメモリ不足の原因を分析することだけです。途中で回復しようとすると、より大きな問題が発生する可能性があります。

バイトコードのインストルメンテーションは可能ですが、難しいです。 HPjmeter の監視ツールには、将来の OOM を予測する機能があります (注意事項あり)。ただし、HP-UX/Itanium ベースのシステムのみです。デーモン スレッドを処理中の使用済みメモリの計算専用にして、これを超えたときにアラートをトリガーすることはできますが、実際には問題を解決していません。

于 2012-07-16T17:59:16.533 に答える