前置核心必背(面试开篇必答,基石知识点)
✅ 1. GC 回收器的设计前提:JVM 内存分代模型
所有垃圾回收器的设计,都基于 JVM 堆内存的「分代收集理论」,这是 GC 的核心原则,所有回收器都遵循这个规则:
- 新生代 :对象「朝生夕死」,98% 的对象刚创建就会被回收,存活率极低 ;内存空间小,回收频率高。新生代采用 复制算法 做垃圾回收,内存划分为
Eden区(80%) + Survivor0区(10%) + Survivor1区(10%),效率极高。 - 老年代 :存放新生代存活下来的「长寿对象」,存活率极高 ;内存空间大,回收频率低。老年代采用 标记 - 清除 / 标记 - 整理算法 做垃圾回收,避免内存复制的巨大开销。
✅ 2. GC 回收器的 2 个核心分类维度(面试必考)
维度一:按【回收区域】划分(核心)
- 新生代回收器 :只负责回收「新生代」内存,包含:
Serial GC、ParNew GC、Parallel Scavenge GC - 老年代回收器 :只负责回收「老年代」内存,包含:
Serial Old GC、Parallel Old GC、CMS GC - 整堆回收器(全区域) :打破分代模型,同时回收新生代 + 老年代 ,包含:
G1 GC、ZGC、Shenandoah GC(JDK8 + 主流)
维度二:按【回收执行方式】划分
- 串行 GC :单线程执行 GC,GC 时会触发 STW(Stop The World),应用线程全部暂停;优点是开销小、适合小内存,缺点是停顿时间长。
- 并行 GC :多线程执行 GC,依然会触发 STW ;优点是回收效率高、吞吐量高,缺点是停顿时间比串行略短(多核场景)。✔️ 注意:并行 GC ≠ 并发 GC ,这是面试最高频易错点,绝对不能混淆!
- 并发 GC :GC 线程和应用线程同时执行 ,只会在 GC 的「关键阶段」触发极短的 STW;优点是应用停顿时间极短,缺点是会占用 CPU 资源、吞吐量略低,适合对响应时间要求高的场景。
✅ 3. GC 的 2 个核心权衡指标(选型唯一标准,面试必背)
所有 GC 回收器的选型,本质都是在这两个指标之间做取舍,鱼和熊掌不可兼得:
- 吞吐量 = 应用程序运行时间 / (应用程序运行时间 + GC 执行时间)
- 吞吐量越高,代表 GC 占用的时间越少,应用能处理的业务请求越多,适合后台任务、数据分析、批处理等场景。
- 停顿时间 :GC 执行时,应用线程被 STW 暂停的时间。
- 停顿时间越短,代表应用的响应越及时,用户体验越好,适合Web 应用、微服务、电商、金融等对响应时间敏感的在线业务。
一、新生代垃圾回收器(3 个)
所有新生代回收器统一使用【复制算法】 ,只回收新生代内存,触发条件都是「新生代内存满」,核心差异是单线程 / 多线程 、优化目标不同。
1. Serial GC(串行回收器,新生代)
- ✅ 核心特性:单线程 新生代回收器,独占 CPU 执行 GC,全程触发 STW。
- ✅ 工作方式:Eden 区满时,单线程将 Eden+S0 的存活对象复制到 S1,回收无用对象;存活对象年龄 + 1,达到阈值进入老年代。
- ✅ 优点:实现简单、GC 线程无开销、内存占用小,适合单核 CPU / 小内存场景。
- ✅ 缺点:单线程效率低,STW 停顿时间长,多核 CPU 下性能极差。
- ✅ 适用场景:JVM 堆内存 ≤ 1G、嵌入式设备、单机小应用,生产环境几乎不用。
2. ParNew GC(并行新生代回收器)
一句话总结:Serial GC 的多线程版本
- ✅ 核心特性:多线程 新生代回收器,基于复制算法,全程触发 STW;线程数默认等于 CPU 核心数。
- ✅ 核心特点:和 Serial GC 的回收逻辑完全一致,只是把单线程改成多线程,回收效率大幅提升(多核场景)。
- ✅ 核心价值:唯一能和 CMS 老年代回收器配合使用的新生代回收器。
- ✅ 优点:多核下比 Serial GC 快很多,回收效率高。
- ✅ 缺点:依然是 STW 回收,停顿时间比 Serial GC 短但依然存在;线程切换有少量开销。
- ✅ 适用场景:配合 CMS 使用的 Web 应用,JDK7/8 中少量使用。
3. Parallel Scavenge GC(并行回收器,又称【吞吐量优先 GC】,新生代)
JDK8 默认的新生代回收器,面试高频重点
- ✅ 核心特性:多线程 新生代回收器,复制算法,全程 STW;唯一以「吞吐量」为核心优化目标的回收器。
- ✅ 核心亮点:支持「自适应调节策略 」------ JVM 会根据当前系统的运行情况,自动调整新生代的内存大小、晋升老年代的年龄阈值等参数,无需手动调优,追求最高吞吐量。
- ✅ 区别于 ParNew:两者都是多线程新生代回收器,但 ParNew 是为了配合 CMS ,而 Parallel Scavenge 是为了极致吞吐量。
- ✅ 优点:吞吐量极致、自动调优、多核下效率极高,无需手动配置参数。
- ✅ 缺点:STW 停顿时间比 ParNew 略长,对响应时间敏感的场景不友好。
- ✅ 适用场景:后台批处理、大数据分析、报表生成、日志处理等吞吐量优先的场景,JDK8 默认选型。
二、老年代垃圾回收器(3 个)
所有老年代回收器无统一算法,回收频率远低于新生代,触发条件是「老年代内存满」或「新生代晋升失败」,核心差异是算法、单 / 多线程、是否并发。
1. Serial Old GC(串行回收器,老年代)
- ✅ 核心特性:单线程 老年代回收器,使用 标记 - 整理算法,全程 STW;是 Serial GC 的老年代配套版本。
- ✅ 工作方式:单线程标记老年代存活对象 → 整理内存(存活对象向一端移动)→ 回收空闲内存,无内存碎片。
- ✅ 优点:无线程开销、内存无碎片、实现简单。
- ✅ 缺点:单线程效率低,STW 停顿时间极长(老年代内存大)。
- ✅ 适用场景:和 Serial GC 搭配,小内存 / 单核场景,生产环境几乎不用。
2. Parallel Old GC(并行回收器,老年代)
JDK8 默认的老年代回收器,面试高频重点
- ✅ 核心特性:多线程 老年代回收器,使用 标记 - 整理算法 ,全程 STW;是 Parallel Scavenge 的老年代配套版本,同样追求「吞吐量优先」。
- ✅ 优点:多核下回收效率极高、吞吐量极致、内存无碎片、支持自适应调优。
- ✅ 缺点:STW 停顿时间较长,对响应时间敏感的场景不友好。
- ✅ 组合使用:
Parallel Scavenge + Parallel Old是 JDK8 默认的 GC 组合,也是企业中「吞吐量优先」场景的首选。 - ✅ 适用场景:后台批处理、大数据分析、日志处理等,和 Parallel Scavenge 完全匹配。
3. CMS GC(Concurrent Mark Sweep,并发标记清除,老年代)
JVM 面试必考 TOP3,史上第一个真正意义的「并发 GC」,里程碑式的回收器,JDK9 被标记为废弃,JDK14 移除
- ✅ 核心定位:老年代回收器,唯一以「低停顿」为核心优化目标的老年代回收器,适合对响应时间要求极高的场景。
- ✅ 核心特性:使用 标记 - 清除算法 ,并发执行 GC,GC 线程和应用线程同时运行,大幅减少 STW 时间。
- ✅ 核心:CMS 的4 个执行阶段(面试必须一字不差背下来) ,只有 2 个阶段触发 STW,且停顿极短 :
- 初始标记(Initial Mark) - 触发 STW,极短:只标记「GC Roots 直接关联的老年代对象」,无遍历,毫秒级完成。
- 并发标记(Concurrent Mark) - 无 STW,核心阶段:GC 线程和应用线程并行,遍历老年代所有存活对象,标记存活节点,耗时最长但不影响应用。
- 重新标记(Remark) - 触发 STW,短:修正并发标记阶段,因应用线程运行产生的「漏标对象」,毫秒级完成。
- 并发清除(Concurrent Sweep) - 无 STW:GC 线程和应用线程并行,清除未被标记的垃圾对象,释放内存。
✅ CMS 的优缺点(面试必考,重中之重)
✅ 优点:极致的低停顿,并发回收,应用响应时间极快,适合 Web / 微服务 / 电商等在线业务。
❌ 缺点(3 个致命缺点,面试必答):
- CPU 敏感:并发阶段会占用 CPU 核心,CPU 核心越少,对应用吞吐量的影响越大(比如单核 CPU 下,CMS 会导致应用卡顿)。
- 内存碎片严重 :使用「标记 - 清除算法」,只清除垃圾不整理内存,会产生大量内存碎片;碎片过多会导致「大对象无法分配内存」,触发Full GC。
- 产生浮动垃圾:并发清除阶段,应用线程还在创建新对象,这些新对象无法被本次 GC 回收,称为「浮动垃圾」;浮动垃圾过多会导致老年代内存满,触发 Full GC。
- ✅ 组合使用:
ParNew + CMS是 JDK7/8 中「低停顿」场景的首选组合。 - ✅ 适用场景:电商、金融、微服务等对响应时间要求极高的在线业务,JDK8 中仍有大量企业使用。
三、整堆垃圾回收器(打破分代,新生代 + 老年代,3 个核心)
统称「现代垃圾回收器」,JDK8 + 的主流选型,面试必考 TOP1 ,全部是企业生产环境的核心选型,优先级远高于上述分代回收器。✔️ 核心特点:打破分代模型 ,不再区分新生代 / 老年代,一个回收器搞定整堆内存回收,兼顾「吞吐量」和「低停顿」,支持大内存(几十 G / 上百 G)。
1. G1 GC(Garbage First,垃圾优先,JDK9 默认 GC)
面试必考 TOP1,企业生产环境绝对主流 ,JDK8u20 后可用,JDK9 默认 GC,JDK8 中最常用的 GC,必须吃透
✅ 核心定位
一款兼顾吞吐量和低停顿 的全能型整堆回收器,目标是「在高吞吐量的前提下,实现可控的低停顿」,完美解决了 CMS 的所有缺点,是目前最均衡、最推荐的 GC 选型。
✅ 核心特性(面试必背,所有特性都是考点)
- 打破分代模型,基于 Region 内存布局 :G1 将整个堆内存划分为多个大小相等的独立 Region(区域,默认 2M~32M),Region 可以动态标记为「新生代 Region」或「老年代 Region」,不再有物理上的分代隔离,回收时按 Region 为单位回收。
- 混合回收机制:G1 会优先回收「垃圾最多的 Region」(Garbage First 的由来),垃圾越多的 Region 回收效率越高,能快速释放内存。
- 回收算法动态切换 :新生代 Region 用「复制算法」,老年代 Region 用「标记 - 整理算法」,无内存碎片,解决 CMS 的碎片问题。
- 可预测的停顿时间 :G1 支持配置
MaxGCPauseMillis(默认 200ms),JVM 会根据这个阈值,自动调整回收的 Region 数量,保证每次 GC 的停顿时间不超过阈值,这是 G1 的核心亮点。 - 全程多线程回收,支持并发回收,STW 时间极短。
✅ G1 的 3 种 GC 模式(面试必答)
- Young GC:只回收新生代 Region,触发 STW,多线程复制算法,频率高,停顿短。
- Mixed GC(混合 GC,核心):回收「新生代 Region + 部分老年代 Region」,G1 的主力 GC,并发执行,STW 时间可控,几乎不会触发 Full GC。
- Full GC :G1 的兜底回收,单线程标记 - 整理,STW 时间极长;触发 Full GC 就是 G1 调优失败的标志,生产环境要极力避免。
✅ G1 的优缺点
✅ 优点:全能型,兼顾吞吐量和低停顿、无内存碎片、支持大内存、可预测停顿时间、解决 CMS 所有缺点。
❌ 缺点:内存占用比 CMS 高(需要维护 Region 元数据),CPU 开销略高,小内存场景下性能不如 CMS。
✅ 适用场景
所有企业级生产环境场景 :微服务、电商、金融、Web 应用、大数据(大内存),JDK8/9/11 的首选 GC,目前 90% 的 Java 项目都在用 G1。
2. ZGC(Z Garbage Collector,JDK11+ 实验性,JDK15 正式版)
面试高级考点 ,极致低停顿的革命性 GC,号称「停顿时间不超过 10ms 」,支持TB 级内存
- ✅ 核心定位:整堆回收器,极致低停顿优先,吞吐量也不差,是为「超大内存、超高并发」场景设计的 GC。
- ✅ 核心特性(面试必背亮点):
- 支持 TB 级堆内存(比如 16G、32G、128G),停顿时间几乎不受内存大小影响,始终≤10ms。
- 全程并发回收,只有极短的 STW(几毫秒),几乎可以忽略不计。
- 使用「染色指针 + 读屏障」技术,无内存碎片,回收效率极高。
- ✅ 优点:停顿时间极致、支持超大内存、无碎片、吞吐量优秀。
- ✅ 缺点:JDK11 才推出,部分老项目兼容性待验证,CPU 开销略高。
- ✅ 适用场景:超大内存的微服务、分布式系统、金融核心系统,JDK11 + 的首选高端 GC。
3. Shenandoah GC(JDK12+)
和 ZGC 定位完全一致,都是极致低停顿的整堆回收器
- ✅ 核心特性:全程并发回收,停顿时间≤10ms,支持超大内存,无内存碎片。
- ✅ 区别于 ZGC:Shenandoah 的实现更轻量,CPU 开销更低,兼容性更好;ZGC 的内存支持上限更高。
- ✅ 适用场景:和 ZGC 一致,超大内存、低停顿优先的场景。
四、JVM GC 回收器【官方合法组合规则】(面试必考,绝对高频)
核心规则:不是任意新生代和老年代回收器都能搭配 ,JVM 有严格的组合限制,以下是全部合法组合,背下来!
- ✅
Serial GC + Serial Old GC- 串行组合,单线程,小内存场景。 - ✅
ParNew GC + CMS GC- 并行新生代 + 并发老年代,低停顿优先,JDK7/8 经典组合。 - ✅
ParNew GC + Serial Old GC- 兜底组合,CMS 失败时自动切换。 - ✅
Parallel Scavenge + Parallel Old GC- 并行组合,吞吐量优先,JDK8 默认组合。 - ✅
G1/ZGC/Shenandoah- 独立使用,无需搭配,自己回收整堆,JDK9 默认 G1。
✔️ 面试易错点:
Parallel Scavenge不能和CMS搭配!JVM 不支持这个组合,很多人会答错。
五、GC 回收器 企业级选型黄金原则(面试必问,终极考点)
面试官一定会问:你们项目用的是什么 GC?为什么这么选? 按以下原则回答,绝对满分,也是企业真实选型逻辑,优先级从高到低:
✅ 总原则:能选 G1 就选 G1,除非有特殊场景
- 场景 1:吞吐量优先(后台任务、批处理、数据分析) → 选
Parallel Scavenge + Parallel Old(JDK8 默认)- 理由:极致吞吐量,无调优成本,自动适配,适合不需要用户交互的后台业务。
- 场景 2:响应时间优先(Web、微服务、电商、金融) → 首选
G1 GC(JDK8u20+)- 理由:兼顾吞吐量和低停顿,无内存碎片,支持大内存,可预测停顿时间,全能型最优解。
- 备选:JDK8 低版本选
ParNew + CMS,但要解决内存碎片问题。
- 场景 3:超大内存(堆内存 ≥ 16G)+ 极致低停顿 → 选
ZGC/Shenandoah(JDK11+)- 理由:停顿时间≤10ms,支持 TB 级内存,适合金融核心、分布式大内存场景。
- 场景 4:小内存(堆内存 ≤ 1G)+ 嵌入式设备 → 选
Serial GC + Serial Old GC- 理由:无线程开销,内存占用小,单核效率高。
六、JVM GC 高频面试题 + 易错点清单(避坑必背,全部是考点)
✅ 高频面试问答(必考,直接背答案)
- 并行 GC 和并发 GC 的区别?→ 并行 GC 是多线程 STW 回收,GC 时应用暂停,追求吞吐量;并发 GC 是 GC 线程和应用线程并行,只有短 STW,追求低停顿。
- CMS 的优缺点和执行阶段?→ 优点:低停顿、并发回收;缺点:CPU 敏感、内存碎片、浮动垃圾。4 个阶段:初始标记 (STW)、并发标记、重新标记 (STW)、并发清除。
- G1 为什么能解决 CMS 的内存碎片问题?→ G1 对老年代 Region 使用「标记 - 整理算法」,CMS 用「标记 - 清除算法」,所以 G1 无内存碎片。
- JDK8 默认的 GC 是什么?JDK9 呢?→ JDK8 默认:Parallel Scavenge + Parallel Old;JDK9 默认:G1 GC。
- G1 的核心优势是什么?→ 打破分代、兼顾吞吐和停顿、无碎片、可预测停顿、优先回收垃圾多的 Region。
✅ 高频易错点(面试踩坑率 90%)
- ❌ 错误:CMS 是无 STW 的 GC → 正确:CMS 有 2 个阶段触发 STW,只是停顿极短。
- ❌ 错误:Parallel Scavenge 可以和 CMS 搭配 → 正确:不支持,官方禁止该组合。
- ❌ 错误:G1 是分代回收器 → 正确:G1 打破分代,基于 Region 布局,是整堆回收器。
- ❌ 错误:吞吐量和停顿时间可以同时最优 → 正确:两者是权衡关系,无法兼得。
- ❌ 错误:ZGC 只能用在 JDK15+ → 正确:JDK11 就有 ZGC(实验性),JDK15 正式发布。
总结(核心速记,考前必看)
- 分代回收器是基础,CMS 是里程碑,G1 是目前的主流和最优解,ZGC 是未来的趋势。
- 所有 GC 的核心是「吞吐量」和「停顿时间」的取舍,没有完美的 GC,只有最合适的 GC。
- 企业选型优先级:
G1 > ParNew+CMS > Parallel+Parallel Old > Serial。 - 面试核心考点:CMS 的 4 个阶段、G1 的特性、GC 组合规则、选型原则。