Java面试题更新 2026-08-03

在 JVM 垃圾回收器的演进中,G1 相比 CMS 主要改进了哪些方面?请从停顿时间控制、内存布局、并发标记和回收效率等角度说明。

考察说明

考查对 JVM 垃圾回收器演进中 G1 与 CMS 设计差异的理解。

回答思路

  1. 【回答框架 1】G1 将堆划分为多个大小相等的 Region,并引入分代思想(Eden、Survivor、Old 均为 Region 集合),而 CMS 使用连续的年轻代和老年代物理空间,这是两者最根本的布局差异。
  2. 【回答框架 2】停顿控制方面,G1 通过维护全局的 RSet 记录跨 Region 引用,并结合启发式算法(根据回收收益和成本)优先回收垃圾最多的 Region(Garbage First),可预测停顿时间,通过 -XX:MaxGCPauseMillis 设定目标;CMS 则不提供停顿预测,主要目标是缩短并发标记阶段的停顿,但最终标记阶段仍会产生较长的 STW。
  3. 【回答框架 3】并发标记与回收:CMS 在并发标记后直接清理老年代(标记-清除),不压缩内存,可能导致碎片化,最终退化为 Serial Old 进行 Full GC;G1 在并发标记后通过复制算法将存活对象复制到新 Region,实现压缩整理,避免碎片化,且整体回收的吞吐量更可控。
  4. 【回答框架 4】实现机制上,G1 使用 SATB(Snapshot-At-The-Beginning)算法进行并发标记,相比 CMS 的增量更新算法更简单、更高效,且减少了写屏障的复杂度;G1 的 RSet 维护成本较高,但通过精细化管理和年轻代回收(Young GC)的并行化,显著降低了单次停顿时长。
  5. 【回答框架 5】适用场景上,G1 适合大堆且对停顿时间敏感的应用,可同时处理年轻代和老年代回收;CMS 更适合小堆且老年代回收需求较少的场景,但在 Java 8 之后官方已弃用 CMS,推荐迁移至 G1 或 ZGC。综合来看,G1 在可预测性、碎片整理和吞吐量平衡上全面优于 CMS。
  6. 【关键点 1】G1 使用 Region 化内存布局,CMS 使用连续物理分区。
  7. 【关键点 2】G1 通过回收收益优先(Garbage First)实现可预测停顿,CMS 无停顿目标控制。
  8. 【关键点 3】G1 在回收过程中压缩整理堆,避免碎片化;CMS 只标记清理,易碎片化退化 Full GC。
  9. 【关键点 4】G1 采用 SATB 标记,CMS 采用增量更新,前者实现更简单。
  10. 【关键点 5】G1 适用于大堆停顿敏感场景,CMS 已废弃并建议迁移至 G1 或 ZGC。
  11. 【易错点 1】G1 的 RSet 维护开销较大,在部分场景下可能增加内存占用和回收成本,不能简单认为 G1 绝对优于 CMS。
  12. 【易错点 2】G1 的停顿时间目标只是软目标,极端情况下可能超时,并非硬保证。
  13. 【易错点 3】CMS 的并发失败会触发 Full GC,G1 同样存在 Full GC(如巨型对象分配失败),不能误以为 G1 完全避免 Full GC。