GNU/Linux >> Linux の 問題 >  >> Linux

Javaでメモリ不足の状態を処理する最良の方法は何ですか?

唯一の現実的なオプションは、(残念ながら) JVM をできるだけ早く終了することです。

おそらく、すべてのコードを変更してエラーをキャッチして応答することはできないためです。 OnOutOfMemoryError を信頼しない場合 (Java 8 で使用され、Windows で動作する vfork を使用すべきではないのはなぜかと思います)、少なくともヒープダンプをトリガーして、これらのファイルを外部から監視できます:

java .... -XX:+HeapDumpOnOutOfMemoryError "-XX:OnOutOfMemoryError=kill %p"

かなり長い間これを試した後、これが私たちにとってうまくいった解決策です:

<オール>
  • 生成された JVM で、OutOfMemoryError をキャッチします。 すぐに終了し、メモリ不足状態を終了コードでコントローラ JVM に通知します。
  • 生成された JVM で、現在の Runtime の消費メモリ量を定期的に確認します。 .メモリの使用量が限界に近づいたら、コントローラ JVM にメモリ不足の状態を通知するフラグ ファイルを作成します。この状態から回復して正常に終了する場合は、終了する前にそのファイルを削除してください。
  • 制御 JVM は、フォークされた JVM に参加した後、手順 (1) で生成された終了コードと、手順 (2) で生成されたフラグ ファイルをチェックします。それに加えて、ファイル hs_err_pidXXX.log 存在し、「メモリ不足エラー」という行が含まれています。 (このファイルは、クラッシュした場合に備えて Java によって生成されます。)
  • これらのチェックをすべて実装して初めて、フォークされた JVM がメモリ不足になるすべてのケースを処理できるようになりました。それ以来、これが起こったケースを見逃すことはないと信じています.

    Java フラグ -XX:OnOutOfMemoryError フォークの問題のため使用されず、-XX:+HeapDumpOnOutOfMemoryError ヒープ ダンプが必要以上であるため、使用されませんでした。

    このソリューションは、確かにこれまでに書かれたコードの中で最も洗練されたものではありませんが、私たちのために仕事をしてくれました.


    Linux
    1. Linuxでホットキーサポートを実装する最良の方法は?

    2. 最高のVPSは何ですか:WindowsまたはLinux?

    3. ボリュームが Bash スクリプトでマウントされているかどうかを確認する最良の方法は何ですか?

    1. 既存のコードで新しいメモリ アロケータを置き換える最適なソリューションは何ですか?

    2. Bash スクリプトのインスタンスが 1 つだけ実行されるようにする最善の方法は何ですか?

    3. sedにタブを挿入する正しい方法は何ですか?

    1. Linux:すべての RAM を使用しているプロセスを見つけますか?

    2. 多くの起動可能なものでフラッシュドライブを作成する最良の方法は何ですか

    3. 分割後にファイルを再度結合する最良の方法は何ですか?