垃圾回收器介绍
垃圾回收器
JVM 的垃圾回收器是实现垃圾回收算法的工具,用于自动管理堆内存,回收不再使用的对象。主要包括: 1. Serial:单线程,适合小规模应用。 2. Parallel:多线程并行,高吞吐量。 3. CMS(Concurrent Mark Sweep):并发低停顿,老年代为主。 4. G1(Garbage First):分代区域化,平衡吞吐量与停顿。 5. ZGC:超低停顿,适合大内存。 6. Shenandoah:并发整理,低停顿。
核心点
- 根据吞吐量、停顿时间需求选择。
1. 回收器详解
(1) Serial(串行回收器)
- 原理:
- 单线程执行 GC。
- 年轻代:标记-复制。
- 老年代:标记-整理。
- 特点:
- STW(Stop The World):暂停所有应用线程。
- 简单,内存占用低。
- 参数:
-XX:+UseSerialGC
。- 优点:
- 开销小,适合单核或小堆。
- 缺点:
- 停顿时间长,多核利用率低。
- 适用:
- 客户端应用,堆 < 100MB。
(2) Parallel(并行回收器)
- 原理:
- 多线程并行执行 GC。
- 年轻代:标记-复制。
- 老年代:标记-整理。
- 特点:
- Parallel Scavenge(年轻代)+ Parallel Old(老年代)。
- 注重吞吐量(运行时间占比)。
- 参数:
-XX:+UseParallelGC
。-XX:ParallelGCThreads=n
:线程数。- 优点:
- 高吞吐量,多核利用好。
- 缺点:
- 停顿时间较长。
- 适用:
- 后台批处理,吞吐量优先。
(3) CMS(并发标记清除)
- 原理:
- 并发执行标记-清除,主要针对老年代。
- 阶段:
- 初始标记(STW):标记 GC Roots。
- 并发标记:与应用线程并行标记。
- 重新标记(STW):修正并发标记遗漏。
- 并发清除:回收垃圾。
- 特点:
- 老年代用标记-清除,年轻代用 Serial 或 ParNew。
- 参数:
-XX:+UseConcMarkSweepGC
。- 优点:
- 低停顿,响应快。
- 缺点:
- 碎片:标记-清除产生碎片。
- 浮动垃圾:并发标记时新生垃圾。
- CPU 占用高。
- 适用:
- Web 服务,响应时间敏感。
(4) G1(Garbage First)
- 原理:
- 将堆分为多个 Region(区域)。
- 年轻代用标记-复制,老年代用标记-整理。
- 优先回收垃圾最多的区域。
- 阶段:
- 初始标记(STW)。
- 并发标记。
- 最终标记(STW)。
- 筛选回收(STW)。
- 特点:
- 可预测停顿时间(
-XX:MaxGCPauseMillis
)。 - 无固定分代,逻辑分代。
- 参数:
-XX:+UseG1GC
。- 优点:
- 平衡吞吐量与停顿。
- 无碎片(整理)。
- 缺点:
- 内存占用高,复杂。
- 适用:
- 大堆(>6GB),低停顿需求。
(5) ZGC(Z Garbage Collector)
- 原理:
- 并发执行所有阶段(标记、转移、整理)。
- 使用染色指针(Colored Pointers)追踪对象。
- 特点:
- 停顿时间 < 10ms,与堆大小无关。
- JDK 11 引入,15 稳定。
- 参数:
-XX:+UseZGC
。- 优点:
- 超低停顿,适合超大堆。
- 缺点:
- 吞吐量稍低,CPU 占用高。
- 不支持 32 位。
- 适用:
- 高可用服务,大内存(>10GB)。
(6) Shenandoah
- 原理:
- 类似 ZGC,并发标记和整理。
- 使用 Brooks Pointers(转发指针)管理引用。
- 特点:
- OpenJDK 项目,Red Hat 主导。
- 停顿时间低至毫秒级。
- 参数:
-XX:+UseShenandoahGC
。- 优点:
- 低停顿,无碎片。
- 缺点:
- 吞吐量稍逊,实验性。
- 适用:
- 低延迟场景,测试环境。
2. 对比表
回收器 | 算法 | 停顿 | 吞吐量 | 特点 | 适用场景 |
---|---|---|---|---|---|
Serial | 标记-复制/整理 | 高 | 中 | 单线程 | 小型应用 |
Parallel | 标记-复制/整理 | 中 | 高 | 多线程并行 | 批处理 |
CMS | 标记-清除 | 低 | 中 | 并发,老年代 | Web 服务 |
G1 | 标记-复制/整理 | 可控 | 高 | 区域化 | 大堆、低停顿 |
ZGC | 并发标记-整理 | 极低 | 中 | 超低停顿 | 大内存、高可用 |
Shenandoah | 并发标记-整理 | 极低 | 中 | 并发整理 | 低延迟实验 |
3. GC 流程示例(G1)
堆: [Eden | S0 | S1 | Old Regions]
1. Eden 满 --> Minor GC (标记-复制到 S0/S1)
2. S0/S1 存活 --> 晋升到 Old
3. Old 满 --> Mixed GC (标记-整理)
4. 延伸与面试角度
- 选择依据:
- 吞吐量:Parallel。
- 低停顿:CMS、G1、ZGC。
- 大堆:G1、ZGC。
- 调优参数:
-Xms
/-Xmx
:堆大小。-XX:GCTimeRatio
:吞吐量目标。- 实际应用:
- Tomcat:G1 或 CMS。
- 大数据:Parallel。
- 面试点:
- 问“种类”时,提六种及特点。
- 问“区别”时,提停顿与吞吐量。
总结
JVM 垃圾回收器从 Serial 到 ZGC,逐步优化吞吐量和停顿时间,适配不同场景。Serial 简单,Parallel 高吞吐,CMS/G1/ZGC 低停顿。面试时,可提算法对应或画 GC 流程,展示理解深度。