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