面试题:JVM 常见的垃圾收集器有哪些?它们有什么区别?
常见的垃圾收集器包括:
- Serial
- Parallel
- CMS
- G1
- ZGC
不同收集器的设计目标不同,有的侧重吞吐量,有的侧重降低停顿时间。
垃圾回收算法和垃圾收集器的区别
垃圾回收算法是回收内存的思路,垃圾收集器是具体执行垃圾回收的实现。
前面学过的三种算法:
- 标记-清除
- 标记-复制
- 标记-整理
垃圾收集器可以根据具体场景采用或组合不同的算法,并实现完整的回收流程。
常见的垃圾收集器
1. Serial 收集器
特点:单线程回收。
- 使用单个 GC 线程执行垃圾回收。
- 回收时通常需要暂停应用线程。
- 实现简单,额外开销相对较低。
- 适合小型堆或资源有限的场景。
记忆关键词:单线程、简单。
2. Parallel 收集器
特点:使用多个线程并行执行垃圾回收,重点关注吞吐量。
- 多个 GC 线程可以同时执行回收任务。
- 目标是提高单位时间内应用完成的工作量。
- 回收期间通常会暂停应用线程。
记忆关键词:并行、吞吐量。
3. CMS 收集器
CMS 全称为 Concurrent Mark Sweep。
特点:通过并发回收思路,尽量减少老年代垃圾回收的停顿时间。
- 以降低应用停顿为目标。
- 部分 GC 工作可以与应用线程并发执行。
- 可能产生内存碎片。
- 已在 JDK 14 中移除。
记忆关键词:并发、低停顿、已移除。
4. G1 收集器
G1 全称为 Garbage-First。
特点:将堆划分为多个 Region,并根据回收收益选择回收区域,尝试控制停顿时间。
主要思路:
- 将堆划分为多个大小相同的 Region。
- 根据用途和运行状态,将 Region 作为 Eden、Survivor 或 Old 等区域使用。
- 统计各个区域的存活对象和可回收空间。
- 优先选择回收收益较高的区域。
- 尽量在设定的停顿时间目标内完成回收。
G1 的主要优势:
- 能够管理较大的堆。
- 可以进行针对多个 Region 的回收。
- 支持设置停顿时间目标。
- 在吞吐量和停顿时间之间进行权衡。
注意:停顿时间目标不是绝对保证。
记忆关键词:Region、回收收益、停顿时间目标。
5. ZGC 收集器
特点:以低延迟为目标,尽量缩短垃圾回收导致的停顿时间。
- 部分回收工作可以与应用线程并发执行。
- 适合对响应延迟敏感的应用。
- 仍然存在短暂停顿,并非完全没有 STW。
记忆关键词:低延迟、并发、短暂停顿。
常见收集器对比
| 收集器 | 核心特点 | 记忆关键词 |
|---|---|---|
| Serial | 单线程回收 | 简单 |
| Parallel | 多线程并行回收 | 吞吐量 |
| CMS | 并发回收,减少老年代停顿 | 历史上的低停顿收集器 |
| G1 | Region 分区,按回收收益选择区域 | 停顿时间目标 |
| ZGC | 尽量缩短回收停顿 | 低延迟 |
注意:具体行为和可用性取决于 JDK 版本及收集器配置。
并行和并发的区别
这是面试中的常见追问。
并行(Parallel)
多个 GC 线程同时工作,执行垃圾回收任务。
并发(Concurrent)
GC 线程和应用线程在一段时间内同时运行。
简单记忆:
- 并行:多个 GC 线程一起工作。
- 并发:GC 线程和应用线程同时工作。
吞吐量和停顿时间
吞吐量
吞吐量指一定时间内,应用线程真正运行并处理业务的时间占比。
例如:程序运行 10 秒,其中应用线程运行 9 秒,GC 暂停 1 秒。
吞吐量 = 应用运行时间 / 总时间 = 9 / 10 = 90%停顿时间
停顿时间是垃圾回收导致应用线程暂停的时间。停顿时间过长,可能导致接口响应延迟增加。
两者的取舍
- 批处理、离线计算可能更关注吞吐量。
- 在线接口、实时交互系统可能更关注响应延迟。
并非停顿越低,吞吐量就一定越高。
面试回答模板
问:JVM 常见的垃圾收集器有哪些?
答:
常见的垃圾收集器包括 Serial、Parallel、CMS、G1 和 ZGC。
Serial 是单线程收集器,结构简单;Parallel 使用多个线程并行回收,重点关注吞吐量;CMS 以减少老年代回收停顿为目标,但已在 JDK 14 中移除;G1 将堆划分为多个 Region,根据回收收益选择区域,尝试控制停顿时间;ZGC 则以低延迟为目标,尽量缩短垃圾回收停顿。
实际选择哪种收集器,需要结合 JDK 版本、堆大小、吞吐量要求和延迟要求决定。
需要记住的重点
- Serial:单线程回收。
- Parallel:并行回收,重点关注吞吐量。
- CMS:历史上的低停顿收集器,JDK 14 已移除。
- G1:Region 分区,重点理解回收收益和停顿时间目标。
- ZGC:低延迟,尽量缩短停顿时间。
- 并行不等于并发。
- 没有一种收集器在所有场景中都是最好的。
自测题
题目 1
哪种收集器重点关注吞吐量?
答案:Parallel 收集器。
题目 2
G1 的核心特点是什么?
答案:将堆划分为多个 Region,根据回收收益选择区域,并尝试控制停顿时间。
题目 3
CMS 目前还存在于 JDK 14 及之后的标准 JDK 中吗?
答案:CMS 已在 JDK 14 中移除。
题目 4
并行和并发有什么区别?
答案:并行指多个 GC 线程同时工作;并发指 GC 线程与应用线程在一段时间内同时运行。
题目 5
ZGC 是否完全没有 STW?
答案:不是。ZGC 的目标是尽量缩短停顿时间,但仍然存在短暂停顿。