在 JDK11 中,ZGC 作为一种实验性功能已经历了多个版本的演进,其设计思想和原理已逐渐成熟。本文将深入分析 ZGC 的核心设计与实现细节。
ZGC 的主要设计理念可概括为以下几点:
- 支持 TB 级内存,采用基于 Page 的分页管理方式,类似于 G1 的 Region,以提升内存管理效率。
- 为加快内存访问速度及并发标记与 relocate 操作,引入了 Color Pointers。这一机制与 Shenandoah GC 的 Brooks Pointers 不同,它依赖于内核提供的多视图映射,但适用性可能略有差异。
- ZGC 设计了两级内存管理系统,以实现高效内存管理。
关于 ZGC 指针布局及内存管理:
- ZGC 指针布局支持 4TB、8TB、16TB 的堆空间,并提供了相应的代码支持。
- 43-0 bit 表示对象地址,47-44 表示对象视图,分为 Marked0、Marked1 和 Remapped 三种。
- x86 和 aarch64 架构下最多支持 48 位指针,这主要是由硬件限制决定的。
- ZGC 通过多视图映射实现同一物理内存的不同虚拟内存视图,如 Marked0、Marked1、Remapped,以区分 GC 阶段。
- ZPhysicalMemory 是 ZGC 对物理内存管理的抽象,不同系统调用相应的实现进行多视图映射。
- ZGC 管理物理内存的基本单位是 segment 和 Page。Segment 默认与 small page size 一致,通常为 2MB。引入 segment 的目的是避免频繁的内存系统申请和释放操作。
关于 ZGC 的内存分配与对象管理:
- ZGC 采用 Page 作为内存管理的基本单位,拥有不同大小的页面类型,如小型、中型和大型页面。
- medium 页 size 的计算方法考虑了堆最大容量和硬件环境,通常为 32MB。而对象 size 限制则根据页 size 的一半计算。
- 分配大对象时,会触发 large page 的分配和对齐操作。
- Page 分配的在 ZHeap 的 alloc_page 方法中。
- ZCollectedHeap 是 ZGC 内存管理的核心类,其中包含了对象分配的相关方法。
- 对象分配遵循一定的流程,根据对象 size 决定使用 small page、medium page 还是 large page 进行分配。
关于并发 GC 与 load barrier:
- ZGC 通过 colored pointer 和多视图技术实现并发标记-整理,避免了传统 GC 在并发环境下的性能压力。
- load barrier 是 ZGC 中一个关键机制,用于在加载对象引用时触发。通过检查 colored pointer 是否为 good color,实现自愈功能。
- load barrier 的实现涉及到 GoodMask 和 BadMask,根据 GC 阶段的不同而变化。
ZGC 还借助读屏障等技术来处理引用关系的增删。虽然 ZGC 没有采用类似 CMS 或 Incremental Update 的策略,但其自有的机制在处理并发问题上表现出色。
线索智能营销团队是字节跳动旗下负责线索营销型产品研发的团队。我们致力于帮助广告主更快速、更高效地获取高价值客户。利用字节的精准流量、数据智能技术,我们提供具有线索获取、线索跟进、培育销转和再营销增长闭环的一站式客户线索管理平台。欢迎加入我们,共同成长。