主题
面试速答(先看这里)
**一句话结论:**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的时长。但是,他们之间还是有很大的不同的:
| 特性 | CMS | G1 |
|---|---|---|
| 回收位置 | 老年代 | 整堆 |
| GC算法 | 标记-清除算法 | 标记-复制算法回收年轻代 标记-整理算法回收老年代 |
| 垃圾识别算法 | 三色标记法——增量更新解决漏标 | 三色标记法——原始快照解决漏标 |
| 碎片产生 | 存在内存碎片 | 可防止内存碎片产生 |
| 可预测性 | 无法预测 | G1的STW时长可预测 |
| 堆内存基本要求 | 一般要求不高 | 4G以上 |
| 自适应调优 | 不支持 | 支持 |
| JDK版本 | 1.8及以前,(JDK14中被移除) | 1.7+ (1.9+的默认GC) |
总结一下就是,G1会把Java的堆分为多个大小相等的Region(每个Region的大小为1M-32M),他在年轻代回收的时候采用标记-复制算法,而在老年代回收的时候,采用的是标记-整理算法,这两种算法都可以避免内存碎片的产生。
G1在回收的过程中,标记和清理的过程是并行的,可以充分利用多个CPU来缩短STW的时长,在复制的过程中是并发的,可以让复制线程和用户线程并发执行,不需要STW。并且G1还可以在运行时动态的做区域内存大小的调整。