5 使用可能なコレクタ
ここまでは、シリアル・コレクタについて説明してきました。Java HotSpot VMには3つの異なるタイプのコレクタがあり、それぞれパフォーマンス特性が異なります。
シリアル・コレクタ
シリアル・コレクタでは単一のスレッドを使用してすべてのガベージ・コレクション作業を実行するので、スレッド間通信のオーバーヘッドが発生しないため、比較的効率的です。
これはマルチプロセッサ・ハードウェアを活用できないので、シングル・プロセッサ・マシンに最適ですが、小規模なデータ・セット(最大で約100MB)を保持するアプリケーションに対しては、マルチプロセッサ上でも使用できる場合があります。シリアル・コレクタは、特定のハードウェアおよびオペレーティング・システム構成でデフォルト選択されていることもあれば、オプション-XX:+UseSerialGC
で明示的に有効にすることもできます。
パラレル・コレクタ
パラレル・コレクタはスループット・コレクタとも呼ばれ、シリアル・コレクタと同様に世代別コレクタです。シリアル・コレクタとパラレル・コレクタとの主な違いは、パラレル・コレクタには複数のスレッドがあり、これを使用してガベージ・コレクションを高速化する点です。
パラレル・コレクタは、マルチプロセッサまたはマルチスレッド・ハードウェアで実行される、中規模から大規模サイズのデータ・セットを保持するアプリケーション向けです。これを有効にするには、-XX:+UseParallelGC
オプションを使用します。
パラレル圧縮は、パラレル・コレクタがメジャー・コレクションを並列実行できるようにする機能です。パラレル圧縮が使用できないと、メジャー・コレクションは単一のスレッドを使用して実行されるので、可用性が大きく制限されます。オプション-XX:+UseParallelGC
が指定されている場合、パラレル圧縮はデフォルトで有効です。これを無効にするには、-XX:-UseParallelOldGC
オプションを使用します。
モーストリ・コンカレント・コレクタ
コンカレント・マーク・スイープ(CMS)コレクタおよびガベージファースト(G1)ガベージ・コレクタは、両方ともモーストリ・コンカレント・コレクタです。モーストリ・コンカレント・コレクタは、負荷が高い作業をアプリケーションと同時に実行します。
-
G1ガベージ・コレクタ: このサーバー型のコレクタは、大規模なメモリーを保持するマルチプロセッサ・マシンを対象としています。ガベージ・コレクション一時停止時間目標を高い確率で満たしながら、高いスループットを実現します。
G1は、特定のハードウェアおよびオペレーティング・システム構成でデフォルト選択されていることもあれば、
-XX:+UseG1GC
を使用して明示的に有効にすることもできます。 -
CMSコレクタ: このコレクタは、ガベージ・コレクションによる一時停止の短縮が優先され、ガベージ・コレクションとプロセッサ・リソースを共有する余裕があるアプリケーションを対象としています。
CMSコレクタを有効にするには、オプション
-XX:+UseConcMarkSweepGC
を使用します
CMSコレクタは、JDK 9以降非推奨になりました。
Zガベージ・コレクタ
Zガベージ・コレクタ(ZGC)はスケーラブルな低レイテンシのガベージ・コレクタです。ZGCは、アプリケーション・スレッドの実行を停止せずに、負荷が高いすべての作業を同時に実行します。
ZGCは、低レイテンシ(一時停止を10ミリ秒未満とする)が要求される、または非常に大きいヒープ(数テラバイト)を使用するアプリケーションを対象としています。これを有効にするには、-XX:+UseZGC
オプションを使用します。
ZGCは、JDK 11以降で実験的な機能として提供されています。
コレクタの選択
それほど厳しい一時停止時間の要件がアプリケーションになければ、まずアプリケーションを実行して、VMにコレクタを選択させます。
必要な場合は、ヒープ・サイズを調整してパフォーマンスを改善します。パフォーマンスがまだ目標を満たさない場合は、次のガイドラインをコレクタ選択の基準として使用してください。
-
アプリケーションが小規模のデータ・セット(最大約100MB)を保持する場合、オプション
-XX:+UseSerialGC
を指定してシリアル・コレクタを選択します。 -
アプリケーションをシングル・プロセッサ上で実行し一時停止時間の要件がない場合は、オプション
-XX:+UseSerialGC
を指定してシリアル・コレクタを選択します。 -
(a) ピーク時のアプリケーションのパフォーマンスを最優先し、(b) 一時停止時間の要件がないか、1秒以上の停止時間が許容される場合は、VMにコレクタを選択させるか、
-XX:+UseParallelGC
を指定してパラレル・コレクタを選択します。 -
レスポンス時間を全体のスループットよりも重視し、ガベージ・コレクションの一時停止を約1秒未満に短く保つ必要がある場合は、
-XX:+UseG1GC
または-XX:+UseConcMarkSweepGC
を指定してモーストリ・コンカレント・コレクタを選択します。 -
レスポンス時間を優先させるか、非常に大きいヒープを使用している場合は、
-XX:UseZGC
を指定して完全コンカレント・コレクタを選択します。
ヒープ・サイズ、アプリケーションが保持するライブ・データの容量、および使用可能なプロセッサの数と速度にパフォーマンスは依存するため、これらのガイドラインはコレクタを選択するための基準を示しているにすぎません。
推奨されるコレクタで必要なパフォーマンスを達成できない場合は、まずヒープ・サイズと世代サイズを調整して、必要な目標を満たすようにしてください。それでもパフォーマンスが不十分な場合は、別のコレクタを試してみます。一時停止時間を短縮するにはコンカレント・コレクタを、マルチプロセッサ・ハードウェア上で全体のスループットを上げるにはパラレル・コレクタを使用します。