web-dev-qa-db-ja.com

GCオーバーヘッド制限を超えました

JVMが「Java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました」をスローするために使用するサンプリング時間はどれくらいですか?パラメータGCTimeLimitとGCHeapFreeLimitで98%と2%を制御できることは知っていますが、サンプリング時間はどうですか?

93
PRK

から Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning

以下

過度のGC時間とOutOfMemoryError

並行コレクターは、ガベージコレクションに時間がかかりすぎるとOutOfMemoryErrorをスローします。合計時間の98%以上がガベージコレクションに費やされ、ヒープの2%未満が回復されると、OutOfMemoryErrorがスローされます。この機能は、ヒープが小さすぎるため、ほとんどまたはまったく進行せずに、アプリケーションが長時間実行されるのを防ぐように設計されています。必要に応じて、オプション-XX:-UseGCOverheadLimitをコマンドラインに追加することにより、この機能を無効にできます。

ポリシーは並列コレクターのポリシーと同じですが、同時収集の実行に費やされた時間が98%の制限時間にカウントされない点が異なります。つまり、アプリケーションの停止中に実行された収集のみが、過度のGC時間にカウントされます。このようなコレクションは、通常、同時モード障害または明示的なコレクション要求(たとえば、System.gc()の呼び出し)が原因です。

さらに下の通路に関連して

明示的なガベージコレクションの最も一般的な使用法の1つは、RMIの分散ガベージコレクション(DGC)で発生します。 RMIを使用するアプリケーションは、他の仮想マシンのオブジェクトを参照します。これらの分散アプリケーションでは、時折ローカルヒープを収集しないとガベージを収集できないため、RMIは定期的に完全な収集を強制します。これらのコレクションの頻度は、プロパティで制御できます。例えば、

Java -Dsun.rmi.dgc.client.gcInterval=3600000

-Dsun.rmi.dgc.server.gcInterval=3600000は、1分に1回というデフォルトのレートではなく、1時間に1回の明示的なコレクションを指定します。ただし、これにより、一部のオブジェクトが回収されるまでにさらに時間がかかる場合があります。 DGCアクティビティの適時性の上限が必要ない場合、これらのプロパティをLong.MAX_VALUEに設定して、明示的なコレクション間の時間を実質的に無限にすることができます。

98%を決定するための評価期間は1分間であることを暗示しているようですが、正しい定義を使用してSunのJVMで構成できる場合があります。

もちろん、他の解釈も可能です。

82
Edwin Buck