zgc的内存映射旨在支撑全并发垃圾回收,通过多视图映射、染色指针与读屏障协同实现stw≤10ms;其虚拟映射不增加物理内存占用,仅提升虚拟地址消耗,并需windows适配页面文件与numa优化。

ZGC的内存映射不是为了节省物理内存,而是为实现全并发垃圾回收提供底层支撑。它通过多视图映射、染色指针与读屏障协同工作,在不暂停应用线程的前提下完成标记、转移等关键操作,从而把STW稳定控制在10ms以内——哪怕堆大小达TB级。
多视图映射:同一物理页,三个虚拟视角
ZGC固定维护Marked0、Marked1和Remapped三个互不重叠的虚拟地址空间,全部映射到同一块物理内存页(或迁移后的新页)。这种设计让GC线程和应用线程“各走各路”:
- 应用线程始终通过Remapped视图访问对象,行为完全透明
- GC线程在Marked0/Marked1视图中并发遍历、标记,无需同步阻塞
- 对象迁移时,GC后台复制数据并原子更新页表项;旧引用由读屏障自动跳转,不中断执行
虚拟内存占用高≠物理内存爆炸
监控看到RSS翻两倍甚至三倍,本质是Linux按“映射次数”统计物理页驻留量:同一物理页被三个虚拟地址映射,就被记三次。而jcmd或Native Memory Tracking显示的是真实堆提交量(如-Xmx16g),两者口径不同,并非内存泄漏。
- ZGC的多重映射只增加虚拟地址空间占用,不额外消耗物理内存
- 实际物理页数量仍由对象数据总量决定,Copy-On-Write机制确保写时才分配新页
- 压缩指针技术进一步压缩高位地址空间,缓解虚拟地址耗尽风险
Windows平台需主动适配虚拟内存策略
Windows对虚拟地址空间和页面文件管理更严格,ZGC的多映射容易触碰系统限制:
- 必须启用页面文件,且建议大小 ≥ -Xmx值,否则可能启动失败或运行中OOM
- 关闭“最大工作集”限制(如通过Local Security Policy),避免mmap调用被拒绝
- 电源计划设为“高性能”,防止线程调度延迟影响读屏障响应
NUMA感知+分级页:让虚拟映射真正落地高效
ZGC在虚拟映射之上叠加物理层优化,避免“映得宽却跑得慢”:
- 小页(2MB)、中页(4MB)、大页(动态)按对象大小自动匹配,减少内部碎片
- 分配时优先落在当前CPU所属NUMA节点,降低跨节点访存延迟
- 预分配+非阻塞分配策略,缓解高并发场景下mmap锁竞争











