ここまでは、シリアル・コレクタについて説明してきました。Java HotSpot VMには3つの異なるタイプのコレクタがあり、それぞれパフォーマンス特性が異なります。
シリアル・コレクタでは単一のスレッドを使用してすべてのガベージ・コレクション作業を実行するので、スレッド間通信のオーバーヘッドが発生しないため、比較的効率的です。これはマルチプロセッサ・ハードウェアを活用できないので、シングル・プロセッサ・マシンに最適ですが、小規模なデータ・セット(最大で約100MB)を保持するアプリケーションに対しては、マルチプロセッサ上でも使用できる場合があります。シリアル・コレクタは、特定のハードウェアおよびオペレーティング・システム構成でデフォルト選択されていることもあれば、オプション-XX:+UseSerialGC
で明示的に有効にすることもできます。
パラレル・コレクタ(スループット・コレクタとも呼ばれる)は、マイナー・コレクションを並列実行するので、ガベージ・コレクションのオーバーヘッドを大幅に削減できます。中規模から大規模なサイズのデータ・セットを保持し、マルチプロセッサまたはマルチスレッド・ハードウェア上で動作するアプリケーションに適しています。パラレル・コレクタは、特定のハードウェアおよびオペレーティング・システム構成でデフォルト選択されていることもあれば、オプション-XX:+UseParallelGC
で明示的に有効にすることもできます。
パラレル圧縮は、パラレル・コレクタがメジャー・コレクションを並列実行できるようにする機能です。パラレル圧縮が使用できないと、メジャー・コレクションは単一のスレッドを使用して実行されるので、可用性が大きく制限されます。オプション-XX:+UseParallelGC
が指定されている場合、パラレル圧縮はデフォルトで有効です。これを無効にするオプションは-XX:-UseParallelOldGC
です。
モーストリ・コンカレント・コレクタは、その作業のほとんどを並行(たとえば、アプリケーションが継続的に実行されている間)に実行して、ガベージ・コレクションの一時停止を短く保ちます。これは中規模から大規模なサイズのデータ・セットを保持し、レスポンス時間が全体のスループットよりも重視されるアプリケーション向けに設計されています(一時停止を最小化する方法によって、アプリケーションのパフォーマンスが低下する可能性があるため)。Java HotSpot VMでは、2つあるモーストリ・コンカレント・コレクタの1つを選択できます(「モーストリ・コンカレント・コレクタ」を参照)。CMSコレクタを有効にする場合はオプション-XX:+UseConcMarkSweepGC
を、G1コレクタを有効にする場合は-XX:+UseG1GC
を使用します。
それほど厳しい一時停止時間の要件がアプリケーションになければ、まずアプリケーションを実行して、VMにコレクタを選択させます。必要な場合は、ヒープ・サイズを調整してパフォーマンスを改善します。パフォーマンスがまだ目標を満たさない場合は、次のガイドラインをコレクタ選択の基準として使用してください。
小規模なデータ・セット(最大で約100MB)を保持するアプリケーションの場合
オプション-XX:+UseSerialGC
を指定してシリアル・コレクタを選択します。
アプリケーションをシングル・プロセッサ上で実行し一時停止時間の要件がない場合は、VMにコレクタを選択させるか、オプション-XX:+UseSerialGC
を指定してシリアル・コレクタを選択します。
(a) ピーク時のアプリケーションのパフォーマンスを最優先し、(b) 一時停止時間の要件がないか、1秒以上の停止時間が許容される場合は、VMにコレクタを選択させるか、-XX:+UseParallelGC
を指定してパラレル・コレクタを選択します。
レスポンス時間を全体のスループットよりも重視し、ガベージ・コレクションの一時停止を約1秒未満に短く保つ必要がある場合は、-XX:+UseConcMarkSweepGC
または-XX:+UseG1GC
を指定してコンカレント・コレクタを選択します。
ヒープ・サイズ、アプリケーションが保持するライブ・データの容量、および使用可能なプロセッサの数と速度にパフォーマンスは依存するため、これらのガイドラインはコレクタを選択するための基準を示しているにすぎません。一時停止時間は特にこれらの要因の影響を受けるため、前に説明した1秒のしきい値は概算値にすぎません。たとえば、パラレル・コレクタでは、データ・サイズとハードウェアの組合せの多くで一時停止時間の長さが1秒を超えることがあり、逆に、コンカレント・コレクタでは、一部の組合せにおいて、一時停止を1秒未満に保てない場合があります。
推奨されるコレクタで必要なパフォーマンスを達成できない場合は、まずヒープ・サイズと世代サイズを調整して、必要な目標を満たすようにしてください。それでもパフォーマンスが不十分な場合は、別のコレクタを試してみます。一時停止時間を短縮するにはコンカレント・コレクタを、マルチプロセッサ・ハードウェア上で全体のスループットを上げるにはパラレル・コレクタを使用します。