[面试题] ZGC 有什么特点?和 CMS、G1 有什么区别?
📖 版块 A:知识讲解版 (温故知新)
-
ZGC 的核心特点:
- 目标是极低停顿时间。
- 停顿时间通常不会随着堆大小线性恶化。
- 大量工作并发执行,包括并发标记、并发转移、并发重定位等。
-
和 CMS 的区别:
- CMS 主打低停顿,但存在内存碎片问题。
- ZGC 低停顿能力更强,且支持并发整理,碎片控制更好。
-
和 G1 的区别:
- G1 在通用场景下更均衡,支持停顿时间预测。
- ZGC 更偏极致低延迟场景。
- G1 仍然会有相对更明显的停顿窗口,ZGC 的停顿更短。
-
适用场景:
- 超大堆。
- 延迟极敏感系统。
- 对吞吐量不是唯一目标,但对响应抖动非常敏感的系统。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:ZGC 有什么特点?和 CMS、G1 有什么区别?
💬 高手逐字稿:
如果用一句话概括 ZGC,我会说它是一个把低停顿目标推到极致的现代垃圾回收器。
它最核心的特点不是“吞吐最高”,而是:停顿时间非常短,而且这个停顿时间不会随着堆越来越大就明显拉长。 这对超大堆、低延迟系统非常有价值。
和 CMS 比,ZGC 最大的优势在于它不只是并发标记做得更激进,它连对象整理和重定位这类 traditionally 很重的事情,也尽量并发化了。所以 ZGC 在控制停顿上,比 CMS 更先进,而且不会像 CMS 那样长期被碎片问题困住。
和 G1 比,差异主要在定位上。G1 更像一个综合能力很强的通用型选手,适合大部分业务系统,既考虑吞吐,也考虑停顿,还支持停顿目标预测;而 ZGC 更像是一个为“超低延迟”定制的专家型选手。
所以如果业务场景是通用 Java 服务,大多数时候默认 G1 就够用了;但如果你面对的是大堆、延迟特别敏感、又不能接受明显停顿抖动的场景,ZGC 的价值就会非常高。
总结一下:
- CMS:早期低停顿代表,但碎片问题明显。
- G1:通用均衡,默认首选。
- ZGC:极致低停顿,适合更高要求场景。
最后更新于: