2 エルゴノミクス

エルゴノミクスは、Java仮想マシン(JVM)およびガベージ・コレクションのヒューリスティック(動作ベースのヒューリスティックなど)でアプリケーションのパフォーマンスを向上させるために使用するプロセスです。

JVMでは、ガベージ・コレクタ、ヒープ・サイズおよびランタイム・コンパイラのデフォルト選択がプラットフォームごとに異なります。これらの選択は、コマンド行でのチューニングをあまり必要とせずに、各種アプリケーションのニーズに対応します。さらに、動作ベースのチューニングでは、アプリケーションの特定の動作にあわせてヒープ・サイズを動的に最適化します。

この項では、このようなデフォルト選択と動作ベースのチューニングについて説明します。これらのデフォルトを試してから、後続の項で説明している詳細な制御を使用してください。

ガベージ・コレクタ、ヒープおよびランタイム・コンパイラのデフォルト選択

次に、重要なガベージ・コレクタ、ヒープ・サイズおよびランタイム・コンパイラのデフォルト選択を示します。 

  • ガベージファースト(G1)コレクタ

  • GCスレッドの最大数は、ヒープ・サイズと使用可能なCPUリソースによって制限されます 

  • 初期ヒープ・サイズ: 物理メモリーの1/64 

  • 最大ヒープ・サイズ: 物理メモリーの1/4 

  • C1とC2の両方を使用する階層型コンパイラ 

動作ベースのチューニング

Java HotSpot VMガベージ・コレクションは、最大一時停止時間とアプリケーション・スループットの2つの目標のいずれかを優先的に満たすように構成できます。優先する目標に達した場合、コレクタはもう一方の目標を最大化しようとします。通常、これらの目標は必ずしも満たせるとはかぎりません。アプリケーションは少なくともすべてのライブ・データを維持するのに最小限のヒープが必要であり、他の構成では一部またはすべての必要な目標に到達しないようにできます。

最大一時停止時間目標

一時停止時間とは、ガベージ・コレクタがアプリケーションを停止して、使用されなくなった領域をリカバリする期間のことです。最大一時停止時間目標は、このような一時停止の最長時間を制限することが目的です。

平均一時停止時間とその平均の偏差はガベージ・コレクタによって保持されます。平均は実行開始時から計算されますが、最近の一時停止ほど重み付けが大きくなるように加重されます。平均一時停止時間とその偏差の合計が最大一時停止時間目標を超えると、ガベージ・コレクタは目標が達成されていないとみなします。

最大一時停止時間目標は、コマンド行オプション-XX:MaxGCPauseMillis=<nnn>で指定します。これは、<nnn>ミリ秒以下の一時停止時間が望ましいという、ガベージ・コレクタへのヒントとして解釈されます。ガベージ・コレクタでは、ガベージ・コレクションによる一時停止を<nnn>ミリ秒未満に維持するように、Javaヒープ・サイズや他のガベージ・コレクション関連パラメータを調整します。最大一時停止時間目標のデフォルト設定は、コレクタによって異なります。このような調整により、ガベージ・コレクションの発生頻度が増え、アプリケーションの全体的なスループットが低下する可能性があります。場合によっては、望ましい一時停止時間目標を満たせないことがあります。

スループット目標

スループット目標はガベージの収集に消費された時間の観点から測定され、ガベージ・コレクション以外で消費された時間は アプリケーション時間となります。

この目標は、コマンド行オプション-XX:GCTimeRatio=nnnで指定します。ガベージ・コレクション時間のアプリケーション時間に対する比率は1 / (1+nnn)です。たとえば、-XX:GCTimeRatio=19は、ガベージ・コレクションに合計時間の20分の1 (5%)という目標を設定します。

ガベージ・コレクションで消費される時間は、一時停止を含むすべてのガベージ・コレクションを合計した時間です。スループット目標が満たされていない場合、ガベージ・コレクタに想定される処理は、コレクションの一時停止と一時停止の間にアプリケーションで費やされる時間を長くするようにヒープ・サイズを増やすことです。

フットプリント

スループット目標と最大一時停止時間目標が満たされている場合、ガベージ・コレクタはどちらかの目標(常にスループット目標)が満たされなくなるまで、ヒープ・サイズを小さくします。ガベージ・コレクタが使用できる最小および最大ヒープ・サイズは、最小および最大ヒープ・サイズにそれぞれ -Xms=<nnn>および-Xmx=<mmm>を使用して設定できます。

チューニング方法

ヒープは選択されたスループット目標に対応するサイズに拡大/縮小されます。最大ヒープ・サイズの選択および最大一時停止時間目標の選択などのヒープ・チューニング方法について学習します。

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

アプリケーションの動作に変更があると、ヒープが拡大/縮小される場合があります。たとえば、アプリケーションが高速な割当てを開始すると、ヒープは同じスループットを維持するために拡大します。

ヒープが最大サイズまで大きくなり、スループット目標が満たされていない場合は、最大ヒープ・サイズがスループット目標に対して小さすぎます。最大ヒープ・サイズをプラットフォームの総物理メモリーに近い値、ただしアプリケーションのスワッピングを引き起こさない程度に設定してください。アプリケーションを再実行します。それでもスループット目標を満たせない場合は、アプリケーション時間の目標がプラットフォームで使用可能なメモリーに対して高すぎます。

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

ガベージ・コレクタでは相反する目標を満たそうとするので、ヒープ・サイズの変動はよくあることです。これは、アプリケーションが定常状態になった場合にも当てはまります。スループット目標(大きなヒープが必要)を達成しようとする圧力は、最大一時停止時間と最小フットプリントの目標(いずれも小さなヒープが必要)と相反します。