ZGC 为什么停顿时间很短?代价是什么?
先自己想一想,再看参考要点
参考要点
- ZGC 把标记和复制都放到与用户线程并发执行的阶段,停顿中只做少量时间有界的工作,停顿时间与堆的大小无关
- 并发复制时对象被移走,用户线程可能还拿着旧地址,ZGC 用着色指针和读屏障解决:引用中用几位元数据记录状态,读取引用时读屏障发现它指向旧地址,就查转发表换成新地址并修正字段
- JDK 21 加入分代模式,JDK 23 起默认分代,分代 ZGC 还用写屏障记录老年代指向新生代的引用
- 实测停顿都在 0.01 ms 以内,但分配速度超过回收速度时出现 Allocation Stall,所以要给堆留出余量,读屏障也会让吞吐量略有下降