シリアル GC

ガベージ コレクションは、ヒープから未参照のオブジェクトを削除し、新しく作成されたオブジェクト用のスペースを確保することにより、Java のメモリ効率を向上させます。

Java 仮想マシンには 8 種類のガベージ コレクターがあります。それぞれについて詳しく考えてみましょう。

シリアル GC は最も単純な GC 実装です。これは、シングルスレッド環境で実行される小規模なアプリケーションを対象としています。すべてのガベージ コレクション イベントは、同じスレッド上で順番に実行されます。圧縮はガベージ コレクションのたびに実行されます。

シリアル GC

コレクターを実行すると、「ワールド ストップ」イベントが発生し、アプリケーション全体が一時停止されます。ガベージ コレクション中にアプリケーション全体がフリーズするため、遅延をできるだけ低く抑えたい場合は、実際にはこれに頼るべきではありません。

シリアル ガベージ コレクターを使用するための JVM 引数は-XX:+UseSerialGC です

並列 GC

並列ガベージ コレクターは、マルチスレッドまたはマルチプロセッサ ハードウェアで実行される中規模から大規模のデータ セットを含むアプリケーション向けに設計されています。これはデフォルトの GC 実装であり、スループット コレクターとしても知られています。

いくつかのスレッドは、若い世代の小さなガベージ コレクションに向けられています。唯一のスレッドは、古い世代のメインのガベージ コレクションでビジー状態です。

並列 GC

並列 GC を実行すると、世界が「停止」し、アプリケーションがハングします。この動作は、バッチ ジョブの実行時など、多くのタスクを完了する必要があり、長時間の停止が許容されるマルチスレッド環境に適しています。

並列ガベージ コレクターを使用するための JVM 引数は-XX:+UseParallelGCです。

CMS GC

ローレストパラレルピッカーとしても知られています。

ここで、小規模なガベージ コレクションの場合、複数のスレッドが関与します。これは、並列コレクターと同じアルゴリズムを通じて行われます。メインのガベージ コレクションは、古い並列 GC と同様にマルチスレッドですが、CMS はアプリケーション プロセスと同時に実行され、「ワールド ストップ」イベントを最小限に抑えます。

CMS GC

このため、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 の使用量が多くなります。

Shenandoah ガベージ コレクターの JVM 引数: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

ZGC

ZGC は、 JDK 11 の一部としてリリースされ、JDK 12 で改良されたもう 1 つの GC です。

これは、速度と低遅延 (10 ミリ秒未満の休止) を必要とするアプリケーションや、非常に大きなヒープ (数テラバイト) を使用するアプリケーションを対象としています。

ZGC の主な目標は、低遅延、スケーラビリティ、使いやすさです。これを行うことで、ガベージ コレクション操作が進行中であるにもかかわらず、Java アプリケーションが実行を継続できるようになります。デフォルトでは、ZGC は未使用のメモリを解放し、オペレーティング システムに返します。

したがって、ZGC は、非常に短いデッドタイム (通常 2 ミリ秒以内) を提供することで、他の従来の GC に比べて大幅な改善をもたらします。

ZGC の主な目的 

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