1520 字
8 分钟
JVM 常见垃圾收集器:Serial、Parallel、CMS、G1 与 ZGC

面试题:JVM 常见的垃圾收集器有哪些?它们有什么区别?

常见的垃圾收集器包括:

  1. Serial
  2. Parallel
  3. CMS
  4. G1
  5. ZGC

不同收集器的设计目标不同,有的侧重吞吐量,有的侧重降低停顿时间。

垃圾回收算法和垃圾收集器的区别#

垃圾回收算法是回收内存的思路,垃圾收集器是具体执行垃圾回收的实现。

前面学过的三种算法:

  • 标记-清除
  • 标记-复制
  • 标记-整理

垃圾收集器可以根据具体场景采用或组合不同的算法,并实现完整的回收流程。

常见的垃圾收集器#

1. Serial 收集器#

特点:单线程回收。

  • 使用单个 GC 线程执行垃圾回收。
  • 回收时通常需要暂停应用线程。
  • 实现简单,额外开销相对较低。
  • 适合小型堆或资源有限的场景。

记忆关键词:单线程、简单。

2. Parallel 收集器#

特点:使用多个线程并行执行垃圾回收,重点关注吞吐量。

  • 多个 GC 线程可以同时执行回收任务。
  • 目标是提高单位时间内应用完成的工作量。
  • 回收期间通常会暂停应用线程。

记忆关键词:并行、吞吐量。

3. CMS 收集器#

CMS 全称为 Concurrent Mark Sweep。

特点:通过并发回收思路,尽量减少老年代垃圾回收的停顿时间。

  • 以降低应用停顿为目标。
  • 部分 GC 工作可以与应用线程并发执行。
  • 可能产生内存碎片。
  • 已在 JDK 14 中移除。

记忆关键词:并发、低停顿、已移除。

4. G1 收集器#

G1 全称为 Garbage-First。

特点:将堆划分为多个 Region,并根据回收收益选择回收区域,尝试控制停顿时间。

主要思路:

  1. 将堆划分为多个大小相同的 Region。
  2. 根据用途和运行状态,将 Region 作为 Eden、Survivor 或 Old 等区域使用。
  3. 统计各个区域的存活对象和可回收空间。
  4. 优先选择回收收益较高的区域。
  5. 尽量在设定的停顿时间目标内完成回收。

G1 的主要优势:

  • 能够管理较大的堆。
  • 可以进行针对多个 Region 的回收。
  • 支持设置停顿时间目标。
  • 在吞吐量和停顿时间之间进行权衡。

注意:停顿时间目标不是绝对保证。

记忆关键词:Region、回收收益、停顿时间目标。

5. ZGC 收集器#

特点:以低延迟为目标,尽量缩短垃圾回收导致的停顿时间。

  • 部分回收工作可以与应用线程并发执行。
  • 适合对响应延迟敏感的应用。
  • 仍然存在短暂停顿,并非完全没有 STW。

记忆关键词:低延迟、并发、短暂停顿。

常见收集器对比#

收集器核心特点记忆关键词
Serial单线程回收简单
Parallel多线程并行回收吞吐量
CMS并发回收,减少老年代停顿历史上的低停顿收集器
G1Region 分区,按回收收益选择区域停顿时间目标
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 的目标是尽量缩短停顿时间,但仍然存在短暂停顿。

JVM 常见垃圾收集器:Serial、Parallel、CMS、G1 与 ZGC
https://blog.xqcherry.top/posts/interview/jvm/garbage-collectors/
作者
xqcherry
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0