美团面试官问我: ZGC 的 Z 是什么意思
> 本文的阅读有一定的门槛,请先了解 GC 的基本只知识。 现代垃圾收集器的演进大部分都是往减少停顿方向发展。 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来减少停顿的时间。 基本上 STW 阶段都是利用多线程并行来减少停顿时间,而并发阶段不会有太多的回收线程工作,这是为了不和应用线程争抢 CPU,反正都并发了慢就慢点(不过还是得考虑内存分配速率)。 而 G1 可以认为是打开了另一个方向的大门: 只回收部分垃圾来减少停顿时间 。 不过为了达到只回收部分 reigon,每个 region 都需要 RememberSet 来记录各 region 之间的引用。这个内存的开销其实还是挺大的,可能会占据整堆的20%或以上。 并且 G1 还有写屏障的开销,虽说用了 logging wtire barrier,但也还是有开销的。 当然 CMS 也用了写屏障,不过逻辑比较简单,啥都没判断就单纯的记录。 其实 G1 相对于 CMS 只有在大堆的场景下才有优势,CMS 比较伤的是 remark 阶段,如果堆太大需要扫描的东西太多。 而 G1 在大堆的时候可以选择部分收集,所以停顿时间有优势。 今天的主角 ZGC 和 G1 一样是基于 reigon 的, 几乎所有阶段都是并发的,整堆扫描,部分收集 。 而且 ZGC 还不分代,就是没分新生代和老年代。