慎重に作成された Java コードの多くが、java.lang.OutOfMemoryError によって無駄にされています。プロダクションクラスのコードでさえ、それによってダウンしてしまいます。
私が聞きたい質問は、このエラーの発生を回避できる優れたプログラミング/アーキテクチャの実践があるかどうかです。
したがって、Java プログラマーが自由に使えるツールは次のようになります。
- java.lang.Runtime.addShutdownHook(Thread hook) -- シャットダウン フックにより、正常な終了が可能になります。
- java.lang.Runtime.freeMemory() -- VM で使用可能なメモリを確認できます
したがって、私が考えたのは、オブジェクトを作成する前に、メモリを割り当てようとする前にシステムに十分なメモリが残っているかどうかをチェックするファクトリ メソッドを記述できるかということです。たとえば、C では、malloc が失敗し、理想的な状況ではなく、メモリー不足であることがわかりますが、単に java.lang.OutOfMemoryError 動脈瘤で死ぬことはありません。
推奨されるアプローチは、より適切なメモリ管理を行うか、メモリ リークを塞ぐか、単にメモリを増やすことです。これらは重要な点であることに同意しますが、次のシナリオを見てみましょう。
- Amazon マイクロ インスタンスで実行しています
- VM に割り当てられるメモリはごくわずかで、たとえば 400M です。
- Java プロセスはマルチスレッド方式でジョブを処理します。各スレッドは、計算タスクのパラメーターに応じてさまざまな量のメモリを消費します。
- 私のプロセスにメモリリークがないと仮定しましょう
- ジョブが完了する前にジョブを供給し続けると、最終的にはメモリ不足で死んでしまいます
- -Xmx を高く設定しすぎると、OS でスワッピングが発生し、スラッシングが発生する可能性があります。
- 同時実行の上限を設定すると、利用可能なRAMで実行できるジョブの受け入れを制限したり、さらに悪いことに、大量のメモリを必要とするジョブを受け入れたりして、最終的にjava.langにアクセスする可能性があるため、最適ではない可能性があります.OutOfMemoryError とにかく。X.質問の動機を説明するのに役立つことを願っています-標準的な回答は、問題に対するフォールトトレラントなアプローチを求めることと相互に排他的ではないと思います。
前もって感謝します。