J2SE 5.0 では、以下の変更が実施されています。
サーバー VM を実行している server-class マシンのガベージコレクタ (GC) が、従来のシリアルコレクタ (-XX:+UseSerialGC
) からパラレルコレクタ (-XX:+UseParallelGC
) に変更されました。このデフォルトは、java
コマンドの -XX:+UseSerialGC
コマンド行オプションを使用することでオーバーライドできます。
パラレルガベージコレクタ (-XX:+UseParallelGC
) を使用していずれかの VM (クライアントまたはサーバー) を実行する server-class マシンで、初期ヒープサイズと最大ヒープサイズが以下のように変更されました。
マシンの物理メモリーの 1/64 または妥当な最小の大きい方。J2SE 5.0 より前は、デフォルト初期ヒープサイズは妥当な最小で、プラットフォームごとに異なっていた。このデフォルトは、-Xms
コマンド行オプションを使用してオーバーライドが可能。
物理メモリーの 1/4 または 1G バイトの小さい方。J2SE 5.0 より前のデフォルトの最大ヒープサイズは 64M バイト。このデフォルトは、-Xmx
コマンド行オプションを使用してオーバーライドが可能。
注: ヒープサイズに指定された限度と分数は、J2SE 5.0 に対して適切です。これは、コンピュータがより高性能になるにつれ、今後のリリースで変更される可能性があります。
パラレルガベージコレクタ (UseParallelGC
) は、少量のヒープを収集するために過剰な時間が消費されている場合、メモリー不足例外をスローします。ヒープサイズを大きくすると、この例外を回避できます。パラメータ -XX:GCTimeLimit=
time-limit および -XX:GCHeapFreeLimit=
space-limit を設定することもできます。
ガベージコレクションに消費される時間の上限 (合計時間に対するパーセント、デフォルトは 98)。
ガベージコレクション中に解放される領域の下限 (最大ヒープに対するパーセント、デフォルトは 2)。
-XX:+UseParallelGC
ガベージコレクタでデフォルトで使用される -XX:+UseAdaptiveSizePolicy
の実装が、以下の 3 つの目標を考慮して変更されました。
実装では以下のことを (この順序で) チェックします。
-XX:MaxGCPauseMillis=
nnnデフォルトでは、一時停止時間目標はありません。一時停止時間目標がどの程度満たせるかについては明確な制限があります。GC の一時停止時間は、ヒープ内のライブデータの量に依存します。収集の大小は、さまざまな面でライブデータの量に依存します。このパラメータは注意して扱うようにしてください。値が小さすぎると、システムがガベージコレクションに過剰な時間が消費されます。
-XX:GCTimeRatio=
nnnたとえば、-XX:GCTimeRatio=19
は、GC の合計時間の 5% という目標と 95% のスループット目標を設定します。つまり、アプリケーションはコレクタの 19 倍の時間を取得するはずです。
デフォルト値は 99 で、アプリケーションがコレクタの少なくとも 99 倍の時間を取得するはずという意味です。つまり、コレクタは合計時間の 1% 以下の時間実行されるはずです。これは、サーバーアプリケーションにとって良い選択肢として選択されました。値が高すぎると、ヒープサイズがその最大値にまで大きくなります。
ヒープがデフォルト最大ヒープサイズよりも大きいことがわかっている場合を除いて、ヒープの最大値を選択しないでください。アプリケーションにとって十分なスループット目標を選択してください。
理想的な状況では、ヒープは選択されたスループット目標をサポートする値 (最大値未満) まで大きくなります。
ヒープが最大値まで大きくなると、スループットはその最大値内で満たせません。最大ヒープはできるだけ大きく、しかしプラットフォームの物理メモリーのサイズより大きくならないように設定してから、もう一度アプリケーションを実行してください。それでもスループット目標が満たせない場合は、それはプラットフォームで使用可能なメモリーに対して高すぎます。
スループットは満たせるけれども、一時停止が長すぎる場合は、一時停止時間目標を選択します。これは、スループット目標が満たされないことを意味する可能性が高いので、アプリケーションにとって受け入れ可能な妥協値である値を選択してください。