シリアル GC
ガベージ コレクションは、ヒープから未参照のオブジェクトを削除し、新しく作成されたオブジェクト用のスペースを確保することにより、Java のメモリ効率を向上させます。
Java 仮想マシンには 8 種類のガベージ コレクターがあります。それぞれについて詳しく考えてみましょう。
シリアル GC は最も単純な GC 実装です。これは、シングルスレッド環境で実行される小規模なアプリケーションを対象としています。すべてのガベージ コレクション イベントは、同じスレッド上で順番に実行されます。圧縮はガベージ コレクションのたびに実行されます。

コレクターを実行すると、「ワールド ストップ」イベントが発生し、アプリケーション全体が一時停止されます。ガベージ コレクション中にアプリケーション全体がフリーズするため、遅延をできるだけ低く抑えたい場合は、実際にはこれに頼るべきではありません。
シリアル ガベージ コレクターを使用するための JVM 引数は-XX:+UseSerialGC です。
並列 GC
並列ガベージ コレクターは、マルチスレッドまたはマルチプロセッサ ハードウェアで実行される中規模から大規模のデータ セットを含むアプリケーション向けに設計されています。これはデフォルトの GC 実装であり、スループット コレクターとしても知られています。
いくつかのスレッドは、若い世代の小さなガベージ コレクションに向けられています。唯一のスレッドは、古い世代のメインのガベージ コレクションでビジー状態です。

並列 GC を実行すると、世界が「停止」し、アプリケーションがハングします。この動作は、バッチ ジョブの実行時など、多くのタスクを完了する必要があり、長時間の停止が許容されるマルチスレッド環境に適しています。
並列ガベージ コレクターを使用するための JVM 引数は-XX:+UseParallelGCです。
CMS GC
ローレストパラレルピッカーとしても知られています。
ここで、小規模なガベージ コレクションの場合、複数のスレッドが関与します。これは、並列コレクターと同じアルゴリズムを通じて行われます。メインのガベージ コレクションは、古い並列 GC と同様にマルチスレッドですが、CMS はアプリケーション プロセスと同時に実行され、「ワールド ストップ」イベントを最小限に抑えます。

このため、CMS コレクターは他のコレクターよりも多くの CPU を消費します。パフォーマンスを向上させるためにより多くの CPU を割り当てることができる場合は、単純な並列コレクターよりも CMS の方が適しています。CMS GC は圧縮されません。
並列マークスイープ ガベージ コレクターを使用するための JVM 引数は-XX:+UseConcMarkSweatGCです。
G1 (ガベージファースト) GC
G1GC はCMS の代替として考案され、大きなヒープ サイズ (4 GB を超える) を特徴とするマルチスレッド アプリケーション向けに開発されました。これは CMS と同様に並列性があり、競争力がありますが、内部では古いガベージ コレクターとはまったく異なる動作をします。
G1 は世代ベースでも運営されていますが、若い世代と古い世代で別々のスペースはありません。代わりに、各世代はリージョンのセットであり、若い世代のサイズを柔軟に変更できます。
G1 は、ヒープを同じサイズの一連の領域 (ヒープのサイズに応じて) に分割し、それらを複数のスレッドにスキャンします。プログラム実行中の領域は、古くなったり若くなったりを繰り返す可能性があります。
マークアップ フェーズが完了すると、G1 はどの領域に最も多くのジャンクが含まれているかを認識します。ユーザーが一時停止を最小限に抑えたい場合、G1 はいくつかのエリアのみを選択できます。一時停止時間がユーザーにとって重要でない場合、または一時停止時間の制限が高く設定されている場合、G1 はより多くの領域をカバーします。
G1 GC は、ガベージが最も多い領域を特定し、最初にそれらの領域に対してガベージ コレクションを実行するため、「ガベージ ファースト」と呼ばれます。

G1GCにはエデン、サバイバー、オールドメモリーのエリアに加えて、さらに2つのタイプがあります。
- Humongous (Huge) - 大きなサイズのオブジェクト (ヒープ サイズの 50% 以上)。
- 利用可能- 未使用または未割り当てのスペース。
G1 ガベージ コレクターを使用するための JVM 引数は-XX:+UseG1GCです。
シェナンドー(シャンダラ)
Shenandoah は、JDK 12 の一部としてリリースされた新しい GC です。G1 に対する Shenandoah の主な利点は、ガベージ コレクション サイクルのほとんどがアプリケーション スレッドと同時に実行されることです。G1 はアプリケーションが一時停止されているときにのみヒープ領域を空にすることができますが、Shenandoah はアプリケーションと同時にオブジェクトを移動します。
Shenandoah は、空きメモリが見つかるとすぐにライブ オブジェクトを圧縮し、ガベージをクリーンアップし、RAM を解放できます。これらすべてがアプリケーションを一時停止することなく同時に行われるため、Shenandoah は CPU の使用量が多くなります。
ZGC
ZGC は、 JDK 11 の一部としてリリースされ、JDK 12 で改良されたもう 1 つの GC です。
これは、速度と低遅延 (10 ミリ秒未満の休止) を必要とするアプリケーションや、非常に大きなヒープ (数テラバイト) を使用するアプリケーションを対象としています。
ZGC の主な目標は、低遅延、スケーラビリティ、使いやすさです。これを行うことで、ガベージ コレクション操作が進行中であるにもかかわらず、Java アプリケーションが実行を継続できるようになります。デフォルトでは、ZGC は未使用のメモリを解放し、オペレーティング システムに返します。
したがって、ZGC は、非常に短いデッドタイム (通常 2 ミリ秒以内) を提供することで、他の従来の GC に比べて大幅な改善をもたらします。

ZGC ガベージ コレクターを使用するための JVM 引数は -XX:+UnlockExperimentalVMOptions -XX:+UseZGC です。
GO TO FULL VERSION