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

注意: Java SE 8以降の場合は、Java HotSpot Virtual Machineガベージ・コレクション・チューニング・ガイドを参照してください。

Java SE 5.0では、次の変更が実施されています。

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

サーバーVMを実行しているserver-classマシンのガベージ・コレクタ(GC)が、従来のシリアル・コレクタ(-XX:+UseSerialGC)からパラレル・コレクタ(-XX:+UseParallelGC)に変更されました。このデフォルトは、javaコマンドの-XX:+UseSerialGCコマンド行オプションを使用することでオーバーライドできます。

初期ヒープ・サイズと最大ヒープ・サイズがパラレル・ガベージ・コレクタ用に変更された

パラレル・ガベージ・コレクタ(-XX:+UseParallelGC)を使用していずれかのVM (クライアントまたはサーバー)を実行するserver-classマシンで、初期ヒープ・サイズと最大ヒープ・サイズが以下のように変更されました。

初期ヒープ・サイズ

マシンの物理メモリーの1/64または妥当な最小の大きい方。Java SE 5.0より前は、デフォルト初期ヒープ・サイズは妥当な最小で、プラットフォームごとに異なっていた。このデフォルトは、-Xmsコマンド行オプションを使用してオーバーライドが可能。

最大ヒープ・サイズ

物理メモリーの1/4または1Gバイトの小さい方。Java SE 5.0より前のデフォルトの最大ヒープ・サイズは64MB。このデフォルトは、-Xmxコマンド行オプションを使用してオーバーライドが可能。

注: ヒープ・サイズに指定された限度と分数は、Java SE 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, 2020, Oracle and/or its affiliates. All rights reserved.