2011-12-15 4 views
0

メモリリークのあるアプリケーションがあるとします。ある時点で、GCはメモリをクリアするのに非常に苦労し、アプリケーションを遅くします。それはOutOfMemoryException例外がスローされます-UseGCOverheadLimit:私はあなたがJVM -XXため、このパラメータを設定した場合ことを知っているガベージコレクタによるアプリケーションの速度低下を防ぐ方法

合計時間の98%以上は、ガベージコレクションとヒープの2%未満に費やされている場合回収される。

しかし、これは何とか私にとって十分ではありません。これらの数字がヒットする前でも私のアプリケーションは非常に遅くなるからです。 GCはOutOfMemoryExceptionがスローされる前にしばらくCPUを吸収します。私の目標は、問題が最も好きであれば、何とか早期に認識し、OutOfMemoryexceptionをスローすることです。その後、私はある種の回復戦略を持っています。

これで、GCTimeLimitとGCHeapFreeLimitの2つの追加パラメータが見つかりました。それらを使用すると、2つの引用定数(98%と2%)を微調整することが可能です。

メモリリークを引き起こし、それらの設定で再生する小さなコードのようなテストを自分で行っています。しかし、私は正しいトレードオフを見つける方法が本当にわからない。私の希望は、他の誰かが同じ問題を抱えていて、合理的な解決策を考え出したか、あるいは私がまだ分かっていない他のGCスイッチがあるかもしれないということです。

私は実際にこのトピックに関する専門家ではないので、少し失われていると感じています。それは考慮できることがたくさんあるようです。

+9

ガベージコレクタを無効にしようとするのではなく、メモリリークを修正する必要がありますか? – Bueller

+3

メモリリークを修正する方が合理的ではないようですか?これはメモリリークの下に落ちたパンのようです。 – corsiKa

+0

どのJVM?どのバージョン? GCチューニングのパラメータ/メソッドは、各JVM実装に対して独自のものです。 –

答えて

0

サイドステップでJVMヒープをステップし、Terra Cotta's Big Memoryのようなものを使用して、直接メモリ管理を使用してガベージコレクタの範囲を超えて成長させます。

0

Sun/Oracle JVMを使用している場合は、thisページはかなり完全なGCチューニングのプライマリであるようです。

+0

2つの答え?なぜ最初のものを編集しないのですか? – mre

+1

@Крысa問題を解決するための複数の選択肢を提供する2つの非常に異なる回答です。 –

1

java.lang.management.MemoryUsageを使用して、使用可能なメモリと使用可能な合計メモリを判断できます。調整可能なGC収集スレッショルドに近づくにつれて、エラーがスローされます。

もちろんこれはちょっとばかげています。より多くのメモリが必要な問題がある場合は、ヒープサイズを増やしてください。より多くの可能性のある問題は、あなたがそれを完了したときに優雅にメモリを解放していないということです。

+0

私は同様の解決策について考えました。しかし、問題は、その動作がちょうど重い負荷状況か何らかの種類のメモリリークであるかどうかを判断することは本当に難しいことです。アプリケーションが十分に解放されていれば、大量のメモリが必要な場合は問題ありません。問題は、各コレクションから何かが残っている場合に発生します。 – kukudas

+0

リリースされる参照されていないオブジェクトが不足しているため、ガベージコレクタはそのサウンドから、スラッシングしています。 Javaメモリリークのかなりの古典的な症状である特定の条件セットに応答するのではなく、しばらく実行した後に起こる場合。ヒープを調べるべきです - http://stackoverflow.com/questions/145922/how-can-i-see-what-is-in-my-heap-in-java – patros

関連する問題