✅G1和CMS有什么区别?

典型回答

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

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

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

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

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

原文: https://www.yuque.com/hollis666/xkm7k3/gkhirkk70lc2zz8z