0Pricing
Java Academy · 课时

垃圾回收算法:Serial、G1、ZGC、Shenandoah

比较现代 JVM 垃圾收集器在暂停特征和吞吐量之间的权衡

垃圾回收算法:Serial、G1、ZGC、Shenandoah 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

选择垃圾回收算法

JVM 提供多种垃圾回收算法,每种算法都针对不同的工作负载进行了优化。选择合适的算法取决于堆大小、延迟要求和吞吐量目标。

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

串行垃圾回收

串行垃圾回收使用单个线程进行回收。垃圾回收期间,所有应用线程都会暂停(暂停整个应用)。它只适用于小堆或单 CPU 环境,例如嵌入式系统。

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

并行垃圾回收(吞吐量收集器)

并行垃圾回收使用多个线程执行次要和主要垃圾回收。其暂停整个应用的时间比串行垃圾回收更短,但仍然比较明显。它最适合批处理,因为此时吞吐量比延迟更重要。

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

G1 垃圾回收(垃圾优先)

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 区、老年代区域或巨型区域(用于大小超过区域大小 50% 的对象)。这种灵活性支持增量式回收。

ZGC(Z 垃圾回收器)

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 垃圾回收

Shenandoah(Red Hat)也通过并发压缩实现了亚毫秒级暂停。它可用于 OpenJDK 构建版本。它与 ZGC 的目标非常相似,但采用了不同的内部算法。

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

分代式 ZGC(Java 21 及更高版本)

Java 21 引入了分代式 ZGC,将 ZGC 的低暂停方式与分代式回收结合起来,在保持暂停时间极短的同时降低 CPU 开销。

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

垃圾回收暂停时间与吞吐量的权衡

没有一种垃圾回收算法在所有方面都最优。并行垃圾回收最大化吞吐量。G1 在吞吐量和延迟之间取得平衡。ZGC 和 Shenandoah 以少量吞吐量为代价,将暂停时间降至最低。

启用垃圾回收日志记录

使用 -Xlog:gc*:file=gc.log:time,uptime,level 记录垃圾回收事件。可以使用 GCViewer 或 GCEasy 等工具分析日志,以发现长时间暂停和分配量突增。

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

使用 JVM 指标监控垃圾回收

使用 ManagementFactory.getGarbageCollectorMXBeans() 以编程方式读取垃圾回收次数和耗时,或者在 Spring Boot 应用中通过 Micrometer 将这些指标导出到 Prometheus。

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

快速检查

哪种垃圾回收算法在生产环境中以亚毫秒级暂停时间为目标?

回顾

小堆使用串行垃圾回收,批处理吞吐量使用并行垃圾回收,均衡型工作负载使用 G1(默认算法),超低延迟场景使用 ZGC 或 Shenandoah。在生产环境中启用垃圾回收日志记录,以便尽早发现问题。

常见问题解答

「垃圾回收算法:Serial、G1、ZGC、Shenandoah」课时是免费的吗?

是的 — 「垃圾回收算法:Serial、G1、ZGC、Shenandoah」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「垃圾回收算法:Serial、G1、ZGC、Shenandoah」这节课中我会学到什么?

比较现代 JVM 垃圾收集器在暂停特征和吞吐量之间的权衡 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「垃圾回收算法:Serial、G1、ZGC、Shenandoah」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. JVM 堆区域与对象生命周期
  2. 垃圾回收算法:Serial、G1、ZGC、Shenandoah
  3. 检测和修复内存泄漏
  4. 垃圾回收调优参数与 JVisualVM 性能分析
← 返回 Java Academy