0Pricing
Java Academy · レッスン

GC アルゴリズム:Serial、G1、ZGC、Shenandoah

最新の JVM ガベージコレクターについて、GC 停止時間の特性とスループットのトレードオフを比較します。

「GC アルゴリズム:Serial、G1、ZGC、Shenandoah」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

GCアルゴリズムの選択

JVMには複数のGCアルゴリズムが用意されており、それぞれ異なるワークロード向けに最適化されています。適切なものは、ヒープサイズ、レイテンシ要件、スループットの目標によって決まります。

// Enable GC algorithms:
// -XX:+UseSerialGC
// -XX:+UseParallelGC
// -XX:+UseG1GC       (default since Java 9)
// -XX:+UseZGC        (Java 15+ production)
// -XX:+UseShenandoahGC (Red Hat / OpenJDK builds)

Serial GC

Serial GCは1つのスレッドで回収を行います。GC中はすべてのアプリケーションスレッドが停止します(「stop-the-world」)。組み込みシステムのような小さなヒープや単一CPUの環境にのみ適しています。

// Use:
// java -XX:+UseSerialGC -Xmx256m MyApp
// Pauses: long (proportional to heap size)
// Throughput: low
// Best for: CLI tools, small heaps < 100 MB

Parallel GC(スループット重視のコレクター)

Parallel GCはMinor GCとMajor GCに複数のスレッドを使用します。stop-the-worldの一時停止はSerialより短くなりますが、それでも大きな影響があります。レイテンシよりスループットが重要なバッチ処理に最適です。

// Use:
// java -XX:+UseParallelGC -XX:ParallelGCThreads=8 MyApp
// Pauses: moderate
// Throughput: high
// Best for: batch jobs, number crunching

G1 GC(Garbage-First)

G1はヒープを同じサイズのリージョン(約2 KB~32 MB)に分割します。最も多くのごみを含むリージョンから先に回収し、設定可能な一時停止時間の目標を満たします。Java 9以降のデフォルトです。

// Use:
// java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApp
// Pauses: bounded by target (but not guaranteed)
// Throughput: good
// Best for: large heaps (4 GB+), mixed workloads

G1リージョンの種類

G1のリージョンは、Eden、Survivor、Old、Humongous(リージョンサイズの50%を超える大きなオブジェクト用)として動的に割り当てられます。この柔軟性により、段階的な回収が可能になります。

ZGC(Z Garbage Collector)

ZGCは、ほとんどの処理をアプリケーションと並行して実行します。ヒープサイズに関係なく、一時停止時間は通常1ミリ秒未満です。Java 15以降で本番利用に対応しています。

// Use:
// java -XX:+UseZGC -Xmx16g MyApp
// Pauses: < 1 ms (usually)
// Throughput: slightly lower than G1 (concurrent work has CPU cost)
// Best for: large heaps, low-latency services (APIs, trading)

Shenandoah GC

Shenandoah(Red Hat)も、並行コンパクションによって1ミリ秒未満の一時停止を実現します。OpenJDKのビルドで利用できます。目標はZGCと非常によく似ていますが、内部アルゴリズムは異なります。

// Use:
// java -XX:+UseShenandoahGC MyApp
// Available in: Red Hat builds, some AdoptOpenJDK distributions
// Pauses: sub-millisecond
// Best for: latency-sensitive workloads

Generational ZGC(Java 21以降)

Java 21ではGenerational ZGCが導入され、ZGCの短い一時停止時間と世代別コレクションを組み合わせています。これにより、一時停止時間を最小限に保ちながらCPUオーバーヘッドを削減します。

// Enable in Java 21+:
// java -XX:+UseZGC -XX:+ZGenerational -Xmx8g MyApp

GC一時停止時間とスループットのトレードオフ

すべてにおいて最適なGCアルゴリズムはありません。Parallel GCはスループットを最大化します。G1はスループットとレイテンシのバランスを取ります。ZGCとShenandoahは、スループットを少し犠牲にして一時停止時間を最小化します。

GCロギングの有効化

-Xlog:gc*:file=gc.log:time,uptime,levelでGCイベントをログに記録します。GCViewerやGCEasyなどのツールでログを分析し、長い一時停止や割り当ての急増を見つけます。

// JVM flags:
// -Xlog:gc*:file=gc.log:time,uptime,level,tags
// Inspect logs:
// cat gc.log | grep "Pause"

JVMメトリクスによるGC監視

ManagementFactory.getGarbageCollectorMXBeans()を使用すると、GCの回数と時間をプログラムから読み取れます。または、Spring BootアプリケーションでMicrometerを介してPrometheusにエクスポートできます。

ManagementFactory.getGarbageCollectorMXBeans().forEach(gc ->
    System.out.printf("%s: %d collections, %d ms%n",
        gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));

確認問題

本番環境で1ミリ秒未満の一時停止時間を目標とするGCアルゴリズムはどれですか。

まとめ

小さなヒープにはSerial GC、バッチのスループットにはParallel GC、バランスの取れたワークロードにはG1(デフォルト)、超低レイテンシにはZGCまたはShenandoahを使用します。本番環境ではGCロギングを有効にして、問題を早期に検出します。

よくある質問

「GC アルゴリズム:Serial、G1、ZGC、Shenandoah」レッスンは無料ですか?

はい。「GC アルゴリズム:Serial、G1、ZGC、Shenandoah」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「GC アルゴリズム:Serial、G1、ZGC、Shenandoah」で何を学びますか?

最新の JVM ガベージコレクターについて、GC 停止時間の特性とスループットのトレードオフを比較します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「GC アルゴリズム:Serial、G1、ZGC、Shenandoah」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JVM ヒープ領域とオブジェクトのライフサイクル
  2. GC アルゴリズム:Serial、G1、ZGC、Shenandoah
  3. メモリーリークの検出と修正
  4. GC チューニングフラグと JVisualVM によるプロファイリング
← Java Academyに戻る