zgc的核心竞争力在于重构内存管理路径,将状态信息统一编码到染色指针中,结合读屏障与动态内存映射实现并发、低延迟垃圾回收,并通过分代zgc在路径层叠加生命周期语义。

ZGC的核心竞争力不在于“更快的算法”,而在于它重构了Java内存管理与对象访问的基本路径——把原本分散在对象头、标记表、记忆集等多处的状态信息,统一收束到指针本身,并让每一次对象访问都成为GC决策的参与节点。
染色指针:让指针自己携带状态
传统GC依赖对象头或独立标记位记录对象是否存活、是否已转移。ZGC直接复用64位指针的高几位(如2–4位),编码标记、重定位、finalize等状态。这意味着:
- 无需额外元数据结构,省去标记表内存开销和遍历成本
- 对象移动后,旧地址仍可安全解引用——指针自带“跳转逻辑”,实现真正的指针自愈
- GC线程与应用线程对同一对象的并发操作,靠指针颜色自动协调,无需全局锁
读屏障:把GC逻辑嵌入每一次对象访问
ZGC不在GC周期开始时批量扫描,而是在每次load指令(即读取对象字段或引用)时插入轻量级读屏障。它检查指针颜色,若发现对象正在重定位中,就立即完成重定向并更新指针——这个动作发生在应用线程自己的上下文中。
- 避免STW下全局暂停扫描GC Roots以外的对象图
- 标记过程天然并发:谁访问谁参与,无需专门标记线程抢占CPU
- 跨代引用、大对象分配、TLAB填充等场景,均通过同一套屏障机制统一保障一致性
动态内存映射:让物理移动对访问透明
ZGC利用Linux mmap的多映射能力,为同一块物理内存页分配多个虚拟地址(例如原地址+新地址)。对象从A地址复制到B地址后,旧指针仍有效,只是被读屏障“悄悄”重定向。
- 应用线程看到的始终是逻辑一致的视图,无需等待所有引用更新完毕
- 压缩整理不再需要“暂停-更新-恢复”三步曲,变成“复制+映射+惰性切换”
- 碎片回收与内存归还可异步进行,不阻塞分配路径
分代ZGC:在路径层叠加生命周期语义
从JDK 21起,ZGC支持-XX:+ZGenerational,并非简单切分堆空间,而是让读屏障和染色指针协同识别代际行为:
- 年轻代对象分配时,指针默认带“新生”色标;晋升时变色,触发不同处理路径
- 记忆集不再由写屏障维护,而是由读屏障在跨代访问时动态捕获并登记
- Minor GC只触发年轻代区域的并发标记与重定位,老年代完全不参与扫描











