ガベージコレクタエルゴノミクス

J2SE 5.0 では、以下の変更が実施されています。

サーバー VM のガベージコレクタがパラレルガベージコレクタに変更された

サーバー 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 を設定することもできます。

time-limit:

ガベージコレクションに消費される時間の上限 (合計時間に対するパーセント、デフォルトは 98)。

space-limit:

ガベージコレクション中に解放される領域の下限 (最大ヒープに対するパーセント、デフォルトは 2)。

パラレルガベージコレクタが使用する -XX:+UseAdaptiveSizePolicy の実装が変更された

-XX:+UseParallelGC ガベージコレクタでデフォルトで使用される -XX:+UseAdaptiveSizePolicy の実装が、以下の 3 つの目標を考慮して変更されました。

実装では以下のことを (この順序で) チェックします。

  1. GC 一時停止時間が一時停止時間目標よりも長い場合は、目標を良い状態で達成するために世代サイズを小さくする。
  2. 一時停止時間目標が満たされている場合は、アプリケーションのスループット目標を検討する。アプリケーションのスループット目標が満たされていない場合は、目標を良い状態で達成するために世代サイズを大きくする。
  3. 一時停止時間目標とスループット目標の両方が満たされている場合は、フットプリントを減らすために世代サイズが小さくされる。

フラグ

-XX:MaxGCPauseMillis=nnn
nnn ミリ秒以下の一時停止時間が望ましいという、仮想マシンへのヒント。VM は、GC による一時停止を nnn ミリ秒未満に維持するように、Java ヒープサイズおよびその他の GC 関連パラメータを調整します。これにより VM の全体スループットが少なくなる可能性がありますが、VM が望ましい一時停止時間目標を満たすことができない場合もあります。

デフォルトでは、一時停止時間目標はありません。一時停止時間目標がどの程度満たせるかについては明確な制限があります。GC の一時停止時間は、ヒープ内のライブデータの量に依存します。収集の大小は、さまざまな面でライブデータの量に依存します。このパラメータは注意して扱うようにしてください。値が小さすぎると、システムがガベージコレクションに過剰な時間が消費されます。

-XX:GCTimeRatio=nnn
コレクタで消費されるアプリケーション実行時間の 1 / (1 + nnn) 以下が望ましいという、仮想マシンへのヒント。

たとえば、-XX:GCTimeRatio=19 は、GC の合計時間の 5% という目標と 95% のスループット目標を設定します。つまり、アプリケーションはコレクタの 19 倍の時間を取得するはずです。

デフォルト値は 99 で、アプリケーションがコレクタの少なくとも 99 倍の時間を取得するはずという意味です。つまり、コレクタは合計時間の 1% 以下の時間実行されるはずです。これは、サーバーアプリケーションにとって良い選択肢として選択されました。値が高すぎると、ヒープサイズがその最大値にまで大きくなります。

推奨される戦略

ヒープがデフォルト最大ヒープサイズよりも大きいことがわかっている場合を除いて、ヒープの最大値を選択しないでください。アプリケーションにとって十分なスループット目標を選択してください。

理想的な状況では、ヒープは選択されたスループット目標をサポートする値 (最大値未満) まで大きくなります。

ヒープが最大値まで大きくなると、スループットはその最大値内で満たせません。最大ヒープはできるだけ大きく、しかしプラットフォームの物理メモリーのサイズより大きくならないように設定してから、もう一度アプリケーションを実行してください。それでもスループット目標が満たせない場合は、それはプラットフォームで使用可能なメモリーに対して高すぎます。

スループットは満たせるけれども、一時停止が長すぎる場合は、一時停止時間目標を選択します。これは、スループット目標が満たされないことを意味する可能性が高いので、アプリケーションにとって受け入れ可能な妥協値である値を選択してください。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.