0%

JVM - 02 Java常见垃圾收集器

Java虚拟机(JVM)提供了多种垃圾收集器(Garbage Collector, GC),每种收集器都有其独特的设计目标和权衡考量,以满足不同应用场景的需求。

1.Java垃圾收集器

Serial GC (串行收集器)

特点: 最简单、历史最悠久的收集器。它使用单个线程执行所有GC工作,并在GC期间暂停所有应用线程(Stop-The-World, STW)。
适用场景: 适用于客户端模式下的小型应用、嵌入式系统或单核CPU机器,这些场景内存有限(通常堆大小小于100MB),协调多线程的开销不划算。
启用参数: -XX:+UseSerialGC

Parallel GC (并行收集器)

特点: 也称吞吐量收集器(Throughput Collector)。它使用多个线程并行执行大部分的GC工作,旨在最大限度地提高应用吞吐量。但它同样会导致应用线程长时间停顿(STW)。
适用场景: 适用于可以容忍较长停顿的批处理系统、数据挖掘等后台服务,这些场景更关注完成总任务的时间,而非单次响应延迟。
默认状态: 是 JDK 5 到 JDK 8 版本的默认垃圾收集器。
启用参数: -XX:+UseParallelGC

CMS GC (Concurrent Mark Sweep 并发标记清除收集器)

特点: 追求低延迟,是第一个尝试与应用线程并发执行大部分标记工作的收集器。它在 GC 过程中只有短暂的 STW 停顿。但是,它不进行内存整理/压缩,容易产生内存碎片。
适用场景: 适用于响应时间敏感的网络服务、Web应用等场景。
状态: 在JDK 9中已被标记为废弃(Deprecated),推荐使用G1或ZGC替代。
启用参数: -XX:+UseConcMarkSweepGC

G1 GC (Garbage-First 垃圾优先收集器)

特点: G1 是 JDK 9及更高版本的默认垃圾收集器。它将堆内存划分为多个大小相等的区域(Region),并根据这些区域的垃圾数量(垃圾最多优先)来智能选择回收区域。它在实现可预测的停顿时间的同时,还能进行整理(压缩),避免内存碎片。
适用场景: 通用型收集器,适用于堆内存较大(通常建议大于 4GB)且需要平衡吞吐量和延迟的场景。
默认状态: JDK 9+ 的默认收集器。
启用参数: -XX:+UseG1GC

ZGC (Z Garbage Collector) / Shenandoah GC

特点: 这两个是现代超低延迟收集器,目标是实现亚毫秒级(<1ms)的停顿时间。它们都能在大容量堆内存(TB级别)上实现几乎恒定的停顿时间,与堆大小无关。它们通过大量的并发工作和有色指针技术实现。
适用场景: 适用于对延迟极其敏感的应用,如实时交易系统、大型内存数据库、需要超低停顿的游戏服务等。
启用参数: -XX:+UseZGC 或 -XX:+UseShenandoahGC (Shenandoah 需要特定 OpenJDK 发行版,如 Red Hat/Adoptium)。

常见的Java垃圾收集器主要包括以下几种,它们的发展历程是从追求高吞吐量逐渐演变为追求低延迟:

2.java各版本及GC收集器份额

java各版本与其收集器

Java_virtual_machine

Java versions and their Garbage Collectors

Version Default GC Available GCs
6u14 Serial /Parallel (MP) Serial, Parallel, CMS, G1 (E)
7u4–8 Serial /Parallel (MP) Serial, Parallel, CMS, G1
9–10 G1 Serial, Parallel, CMS, G1
11 G1 Serial, Parallel, CMS, G1, Epsilon (E), ZGC (E)
12–13 G1 Serial, Parallel, CMS, G1, Epsilon (E), ZGC (E), Shenandoah (E)
14 G1 Serial, Parallel, G1, Epsilon (E), ZGC (E), Shenandoah (E)
15–20 G1 Serial, Parallel, G1, Epsilon (E), ZGC, Shenandoah
21–22 G1 Serial, Parallel, G1, Epsilon (E), ZGC, Shenandoah, GenZGC (E)
23 G1 Serial, Parallel, G1, Epsilon (E), ZGC, Shenandoah, GenZGC (default ZGC)
24 G1 Serial, Parallel, G1, Epsilon (E), Shenandoah, GenZGC, GenShen (E)
25 G1 Serial, Parallel, G1, Epsilon (E), Shenandoah, GenZGC, GenShen
(E) = experimental

份额对比

来源:2024 State of the Java Ecosystem

java长期支持版本采用情况(2024年)

Alt text

java8使用份额在逐年减少。

java生产版本采用情况(2025年)

Azul-report-State-of-Java-2025报吿中的份额如下
Alt text

java21(LTS) 的份额在逐年增加。

LTS版本java的GC收集器采用情况

Alt text

java7/java8版本,CMS、G1与Parallel份额差不多,都在20%左右。
java11以后,默认都是使用G1算法,但Serial也有其使用场景。

3.参考资料

2024 State of the Java Ecosystem
Azul-report-State-of-Java-2025
HotSpot Virtual Machine Garbage Collection Tuning Guide
杨晓峰 - Java常见的垃圾收集器有哪些?

– end –