ZGC通过多视图映射、染色指针与读屏障、NUMA感知分配及分代模式,实现全并发回收并控制STW在10ms内:三视图使标记/转移与应用线程并发;元数据嵌入指针高位,读屏障仅耗10–20ns;按大小分级页与NUMA本地分配降延迟;分代模式收窄扫描范围。

ZGC的内存映射不是为了“节省物理内存”,而是为实现全并发垃圾回收提供底层支撑。它带来的性能提升,核心在于消除了传统GC中多个关键阶段的Stop-The-World(STW)停顿,从而把GC暂停时间稳定控制在10ms以内——哪怕堆大小从几GB升至数TB。
多视图映射:让标记与转移真正并发
ZGC固定维护三个虚拟地址视图(Marked0、Marked1、Remapped),全部指向同一块物理内存页。这种设计使应用线程和GC线程能“各看各的地址”,互不阻塞:
- 应用线程始终通过Remapped视图读写对象,行为完全正常
- GC线程在Marked0/Marked1视图中并发遍历对象图、标记存活对象,无需暂停应用
- 对象迁移时,GC在后台将数据复制到新页,并原子更新Remapped视图的页表项;旧引用通过读屏障自动重定向,不中断执行
染色指针 + 读屏障:状态管理零同步开销
ZGC把标记位、重映射位等元数据直接编码进64位指针高位(如Marked0/Marked1/Remapped标志),省去了传统GC所需的独立标记位图或记忆集维护成本:
- 对象访问时触发轻量级读屏障,仅检查指针颜色并按需重定位,平均开销约10–20ns
- 所有状态变更都在指针本身完成,GC线程与应用线程无需锁或CAS同步
- 避免了G1中Remembered Set写入竞争、CMS中卡片标记刷脏等高争用操作
NUMA感知分配 + 页面分级:降低访存延迟
ZGC在虚拟内存管理之上叠加了物理层优化:
- 按对象大小自动划分小页(2MB)、中页(4MB)、大页(可至数百MB),减少内部碎片
- 优先在当前CPU所属NUMA节点分配内存,避免跨节点远程访问
- 页面分配采用非阻塞策略,配合预分配机制,缓解高并发分配时的锁竞争
分代模式进一步收窄扫描范围(JDK 17+)
启用-XX:+ZGenerational后,ZGC不再对全堆做统一标记:
- 年轻代采用高频、小范围并发复制,快速回收朝生夕灭对象
- 老年代只在必要时触发并发标记,大幅减少扫描对象数量
- 跨代引用由轻量级记忆集追踪,开销远低于全堆根扫描


















