エルゴノミクスは、Java仮想マシン(JVM)およびガベージ・コレクションのチューニング(動作ベースのチューニングなど)でアプリケーションのパフォーマンスを向上させるために使用するプロセスです。 JVMでは、ガベージ・コレクタ、ヒープ・サイズおよびランタイム・コンパイラのデフォルト選択がプラットフォームごとに異なります。 これらの選択は、コマンド行でのチューニングをあまり必要とせずに、各種アプリケーションのニーズに対応します。 さらに、動作ベースのチューニングでは、アプリケーションの特定の動作に合せてヒープ・サイズを動的に調整します。
この項では、このようなデフォルト選択と動作ベースのチューニングについて説明します。 これらのデフォルトを最初に試してから、後続の項で説明している詳細な制御を使用してください。
server-classマシンと呼ばれるクラスのマシンは、次を搭載したマシンとして定義されています。
2個以上の物理プロセッサ
2GB以上の物理メモリー
server-classマシンでは、次がデフォルトで選択されています。
スループット・ガベージ・コレクタ
初期ヒープ・サイズ: 物理メモリーの1/64 (最大1GB)
最大ヒープ・サイズ: 物理メモリーの1/4 (最大1GB)
サーバー・ランタイム・コンパイラ
64ビット・システムの初期ヒープ・サイズと最大ヒープ・サイズについては、「パラレル・コレクタ」の「デフォルト・ヒープ・サイズ」を参照してください。
server-classマシンの定義は、Windowsオペレーティング・システムのバージョンが動作している32ビット・プラットフォームを除くすべてのプラットフォームに適用されます。 表2-1「デフォルト・ランタイム・コンパイラ」に、各種プラットフォーム別のランタイム・コンパイラの選択を示します。
表2-1 デフォルト・ランタイム・コンパイラ
プラットフォーム | オペレーティング・システム | DefaultFoot1 | Server-Classのデフォルト脚注1 |
---|---|---|---|
i586 |
Linux |
クライアント |
サーバー |
i586 |
Windows |
クライアント |
ClientFoot2 |
SPARC (64ビット) |
Solaris |
サーバー |
ServerFoot3 |
AMD (64ビット) |
Linux |
サーバー |
ServerFootref3 |
AMD (64ビット) |
Windows |
サーバー |
ServerFootref3 |
脚注1クライアントは、クライアント・ランタイム・コンパイラが使用されることを意味します。 サーバーは、サーバー・ランタイム・コンパイラが使用されることを意味します。
脚注2server-classマシンであってもクライアント・ランタイム・コンパイラを使用するポリシーが選択されています。 これを選択した理由は、従来、このプラットフォームとオペレーティング・システムの組合せではクライアント・アプリケーション(対話型アプリケーションなど)の方がより頻繁に実行されていたためです。
脚注3サーバー・ランタイム・コンパイラのみがサポートされています。
Java SEには、パラレル・コレクタ用に、アプリケーションの特定動作の実現をベースとする2つのガベージ・コレクション・チューニング・パラメータ(最大一時停止時間目標とアプリケーション・スループット目標)が用意されています。「パラレル・コレクタ」を参照してください。 (この2つのオプションは他のコレクタでは使用できません。) これらの動作は必ずしも満たされるわけではありません。 アプリケーションには、少なくともすべてのライブ・データを収容できる大きさのヒープが必要です。 また、最小ヒープ・サイズではこれらの望ましい目標を達成できない場合があります。
一時停止時間とは、ガベージ・コレクタがアプリケーションを停止して、使用されなくなった領域をリカバリする期間のことです。 最大一時停止時間目標は、このような一時停止の最長時間を制限することが目的です。 平均一時停止時間とその平均の偏差はガベージ・コレクタによって保持されます。 平均は実行開始時から計算されますが、最近の一時停止ほど重み付けが大きくなるように加重されます。 平均一時停止時間とその偏差の合計が最大一時停止時間目標を超えると、ガベージ・コレクタは目標が達成されていないとみなします。
最大一時停止時間目標は、コマンド行オプション-XX:MaxGCPauseMillis=
<nnn>
で指定します。 これは、<nnn>
ミリ秒以下の一時停止時間が望ましいという、ガベージ・コレクタへのヒントとして解釈されます。 ガベージ・コレクタでは、ガベージ・コレクションによる一時停止を<nnn>
ミリ秒未満に維持するように、Javaヒープ・サイズや他のガベージ・コレクション関連パラメータを調整します。 デフォルトでは、最大一時停止時間目標はありません。 このような調整により、ガベージ・コレクタの発生頻度が増え、アプリケーションの全体的なスループットが低下する可能性があります。 ガベージ・コレクタは、一時停止時間目標がある場合は、スループット目標よりも先にそれを満たそうとします。 場合によっては、望ましい一時停止時間目標を満たせないことがあります。
スループット目標は、ガベージの収集に消費された時間とガベージ・コレクション以外で消費された時間(アプリケーション時間と呼ばれる)の観点から測定されます。 この目標は、コマンド行オプション-XX:GCTimeRatio=
<nnn>
で指定します。 ガベージ・コレクション時間のアプリケーション時間に対する比率は1 / (1 + <nnn>
)です。 たとえば、-XX:GCTimeRatio=19
は、ガベージ・コレクションに合計時間の20分の1 (5%)という目標を設定します。
ガベージ・コレクションで消費される時間は、若い世代と古い世代の両方のガベージ・コレクションを合計した時間です。 スループット目標が満たされていない場合は、コレクション間でのアプリケーション実行時間を増やすために、世代サイズを大きくします。
デフォルト最大ヒープ・サイズよりも大きいヒープが必要なことがわかっている場合を除いて、ヒープの最大値を選択しないでください。 アプリケーションにとって十分なスループット目標を選択してください。
ヒープは選択されたスループット目標に対応するサイズに拡大/縮小されます。 アプリケーションの動作に変更があると、ヒープが拡大/縮小される場合があります。 たとえば、アプリケーションが高速な割当てを開始すると、ヒープは同じスループットを維持するために拡大します。
ヒープが最大サイズまで大きくなり、スループット目標が満たされていない場合は、最大ヒープ・サイズがスループット目標に対して小さすぎます。 最大ヒープ・サイズをプラットフォームの総物理メモリーに近い値、ただしアプリケーションのスワッピングを引き起こさない程度に設定してください。 アプリケーションを再実行します。 それでもスループット目標が満たせない場合は、アプリケーション時間の目標がプラットフォームで使用可能なメモリーに対して高すぎます。
スループット目標は満たせるけれども、一時停止が長すぎる場合は、最大一時停止時間目標を選択します。 最大一時停止時間目標を選択すると、スループット目標が満たされなくなる可能性があるので、アプリケーションにとって受け入れ可能な妥協値を選択してください。
ガベージ・コレクタでは相反する目的を満たそうとするので、ヒープ・サイズの変動はよくあることです。 これは、アプリケーションが定常状態になった場合にも当てはまります。 スループット目標(大きなヒープが必要)を達成しようとする圧力は、最大一時停止時間と最小フットプリントの目標(いずれも小さなヒープが必要)と相反します。