zgc通过染色指针与读屏障实现对象并发重定位,结合多映射内存零拷贝转移、region粒度整理及并发标记-转移双阶段协同,彻底解决大堆内存碎片问题且全程几乎不停顿。

ZGC通过并发压缩与重定位,在不停止应用的前提下彻底解决内存碎片问题,核心在于把整理动作从“停顿中完成”变成“边运行边收拾”。它不依赖传统分代或复制式回收,而是靠底层机制保障堆空间始终紧凑可用。
染色指针 + 读屏障实现对象安全移动
ZGC把对象状态(如是否已标记、是否已转移)直接编码进64位指针的高位,称为“染色指针”。当对象被重定位到新地址时,旧指针仍可解引用——读屏障会在每次访问对象前检查指针颜色,若发现对象已被转移,就自动更新为新地址并重试。这样应用线程无需暂停,就能持续访问正确位置的对象。
- 避免了写屏障带来的性能开销,只在读取时介入,对吞吐影响更小
- 指针自愈机制让重定位对业务代码完全透明
- 所有对象转移都通过这种方式完成,是并发整理的基础保障
多映射内存支持零拷贝重定位
ZGC利用Linux虚拟内存的多重映射能力,让同一物理内存页同时映射到多个虚拟地址。重定位时,只需修改页表映射关系,把原地址映射指向新页,而不用真正复制数据——物理内存没动,只是“换个门牌号”。这大幅降低转移开销,使并发整理在大堆场景下依然高效。
- 适用于4GB大小的Region,每个Region可独立重定位
- 避免传统复制算法的数据搬运成本
- 配合NUMA感知调度,进一步减少跨节点访问延迟
并发标记与并发转移双阶段协同
ZGC将整个回收周期拆成极短STW阶段(仅处理GC Roots和少量元数据)+ 长时间并发阶段。其中,并发标记识别存活对象,并发转移则把它们批量迁移到连续空闲Region中。转移完成后,原Region被整体释放,天然消除外部碎片。
- 转移目标Region始终是连续且未使用的,迁移后空间完全干净
- 不依赖对象年龄或代际划分,所有Region一视同仁参与整理
- 即使堆达TB级,碎片整理压力也不会线性增长
Region粒度管理提升整理效率
ZGC把堆划分为2MB大小的Region(默认),每个Region可独立决定是否参与本次回收。整理不是全堆扫描,而是按需挑选碎片化严重或回收价值高的Region进行重定位。这种细粒度控制让整理更精准、更轻量。
- Region内对象集中存放,重定位时局部性好,缓存友好
- 空闲Region自动合并,避免小块碎片堆积
- 大对象(Humongous Object)也按Region对齐,减少跨Region碎片











