zgc通过三色标记、着色指针与读屏障协同实现低延迟并发标记:三色标记以原子cas驱动状态变迁;着色指针将标记位嵌入指针高位实现无锁去重;读屏障拦截并发修改防止漏标;页面级并行提升吞吐与缓存效率。

ZGC在并发标记阶段通过三色标记协议、着色指针与读屏障协同工作,让GC线程和业务线程(mutator)同时运行,既不中断应用,又能准确识别所有活对象。
三色标记提供状态驱动的并发遍历模型
每个对象被赋予白、灰、黑三种状态:
- 白色:尚未访问,可能为垃圾;
- 灰色:已访问但子引用未扫描完,是遍历中的“待处理中”节点;
- 黑色:自身及所有直接引用对象均已扫描完成,属于确定存活的子图一部分。
多个GC工作线程可并行从灰色集合中取出对象,将其引用的白色对象染灰、自身染黑。只要状态变更通过原子操作(如CAS)保证,就不会出现重复处理或状态撕裂。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
着色指针实现无锁、硬件级去重
ZGC把标记状态直接编码进对象指针的高位(如4位),而非依赖全局队列或锁:
- 所有线程访问同一对象时,通过该指针读取的状态天然一致;
- 当GC线程尝试将某白色对象染灰,执行原子CAS:仅当前为白色才成功写入灰色;失败说明已被其他线程抢先处理;
- 这种设计让“多线程重复扫描同一对象”的概率趋近于零,不是靠调度回避,而是靠指针状态+硬件原子性硬保障。
读屏障拦截并发修改引发的漏标风险
业务线程在解引用对象前,必须经过读屏障检查:
- 若发现目标对象处于“已标记但未重定位”或“正在转移中”,则触发即时重定位或转发;
- 确保后续访问始终命中最新地址与状态,防止因mutator修改引用链(如A→B断开、A→C新建)导致路径跳过或分裂;
- 这相当于在对象被访问的“入口处”动态修补遍历视图,弥补并发带来的可达性偏差。
以页面为单位组织并行粒度
ZGC不按单个对象调度,而是将堆划分为固定大小的页面(如2MB),每个GC工作线程负责一个或多个页面:
- 页面内对象连续布局,缓存友好,提升扫描吞吐;
- 页面作为任务单元便于负载均衡与快速分发;
- 配合三色状态与着色指针,天然支持跨页面引用的连贯遍历,保障整个活对象图全覆盖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










