Skip to content

面试速答(先看这里)

**一句话结论:**G1 和 CMS相比,他们都是基于三色标记法实现的,替代了原有的传统的可达性分析(三色标记也是可达性分析的一种,只不过特殊一点),可以大大的降低STW的时长。

60秒标准回答:

G1 是 JDK 1.9中默认的垃圾收集器,他代替了Java 8 中的默认的Parallel Scavenge GC+Parallel Old GC,并且也代替了CMS

G1 和 CMS相比,他们都是基于三色标记法实现的,替代了原有的传统的可达性分析(三色标记也是可达性分析的一种,只不过特殊一点),可以大大的降低STW的时长。但是,他们之间还是有很大的不同的

标记-复制算法回收年轻代

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**G1 是 JDK 1.9中默认的垃圾收集器,他代替了Java 8 中的默认的Parallel Scavenge GC+Parallel Old GC,并且也代替了CMS。
  • **要点2:**1.8及以前,(JDK14中被移除)
  • **要点3:**总结一下就是,G1会把Java的堆分为多个大小相等的Region(每个Region的大小为1M-32M),他在年轻代回收的时候采用标记-复制算法,而在老年代回收的时候,采用的是标记-整理算法,这两种算法都可以避免内存碎片的产生。
  • **要点4:**G1在回收的过程中,标记和清理的过程是并行的,可以充分利用多个CPU来缩短STW的时长,在复制的过程中是并发的,可以让复制线程和用户线程并发执行,不需要STW。

**记忆锚点:**CMS → STW → Region → Java → 复制算法 → 整理算法

易错提醒:

  • 但是,他们之间还是有很大的不同的: 标记-复制算法回收年轻代 标记-整理算法回收老年代 三色标记法——增量更新解决漏标 三色标记法——原始快照解决漏标 可防止内存碎片产生 G1的STW时长可预测 1.8及以前,(JDK14中被移除) 1.7+ (1.9+的默认GC) 总结一下就是,G1会把Java的堆分为多个大小相等的Region(每个Region的大小为1…

追问准备:

  • 围绕「CMS」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「STW」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Region」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

G1 是 JDK 1.9中默认的垃圾收集器,他代替了Java 8 中的默认的Parallel Scavenge GC+Parallel Old GC,并且也代替了CMS。

G1 和 CMS相比,他们都是基于三色标记法实现的,替代了原有的传统的可达性分析(三色标记也是可达性分析的一种,只不过特殊一点),可以大大的降低STW的时长。但是,他们之间还是有很大的不同的:

特性CMSG1
回收位置老年代整堆
GC算法标记-清除算法标记-复制算法回收年轻代 标记-整理算法回收老年代
垃圾识别算法三色标记法——增量更新解决漏标三色标记法——原始快照解决漏标
碎片产生存在内存碎片可防止内存碎片产生
可预测性无法预测G1的STW时长可预测
堆内存基本要求一般要求不高4G以上
自适应调优不支持支持
JDK版本1.8及以前,(JDK14中被移除)1.7+ (1.9+的默认GC)

总结一下就是,G1会把Java的堆分为多个大小相等的Region(每个Region的大小为1M-32M),他在年轻代回收的时候采用标记-复制算法,而在老年代回收的时候,采用的是标记-整理算法,这两种算法都可以避免内存碎片的产生。

G1在回收的过程中,标记和清理的过程是并行的,可以充分利用多个CPU来缩短STW的时长,在复制的过程中是并发的,可以让复制线程和用户线程并发执行,不需要STW。并且G1还可以在运行时动态的做区域内存大小的调整。