メモリリークのあるアプリケーションがあるとします。ある時点で、GCはメモリをクリアするのに非常に苦労し、アプリケーションを遅くします。それはOutOfMemoryException例外がスローされます-UseGCOverheadLimit:私はあなたがJVM -XXため、このパラメータを設定した場合ことを知っているガベージコレクタによるアプリケーションの速度低下を防ぐ方法
合計時間の98%以上は、ガベージコレクションとヒープの2%未満に費やされている場合回収される。
しかし、これは何とか私にとって十分ではありません。これらの数字がヒットする前でも私のアプリケーションは非常に遅くなるからです。 GCはOutOfMemoryExceptionがスローされる前にしばらくCPUを吸収します。私の目標は、問題が最も好きであれば、何とか早期に認識し、OutOfMemoryexceptionをスローすることです。その後、私はある種の回復戦略を持っています。
これで、GCTimeLimitとGCHeapFreeLimitの2つの追加パラメータが見つかりました。それらを使用すると、2つの引用定数(98%と2%)を微調整することが可能です。
メモリリークを引き起こし、それらの設定で再生する小さなコードのようなテストを自分で行っています。しかし、私は正しいトレードオフを見つける方法が本当にわからない。私の希望は、他の誰かが同じ問題を抱えていて、合理的な解決策を考え出したか、あるいは私がまだ分かっていない他のGCスイッチがあるかもしれないということです。
私は実際にこのトピックに関する専門家ではないので、少し失われていると感じています。それは考慮できることがたくさんあるようです。
ガベージコレクタを無効にしようとするのではなく、メモリリークを修正する必要がありますか? – Bueller
メモリリークを修正する方が合理的ではないようですか?これはメモリリークの下に落ちたパンのようです。 – corsiKa
どのJVM?どのバージョン? GCチューニングのパラメータ/メソッドは、各JVM実装に対して独自のものです。 –