ZGC(Z Garbage Collector)是Oracle开发的一种低延迟垃圾收集器,旨在实现亚毫秒级停顿时间,同时支持多TB级堆内存。以下是其详细介绍、工作过程及核心原理:
一、ZGC简介
-
设计目标:
- 超低停顿:将停顿时间(STW)控制在10ms以下,甚至亚毫秒级。
- 大堆支持:高效管理数TB级别的堆内存,适合现代内存密集型应用。
- 并发性:几乎所有阶段(标记、转移、重定位)均与应用程序线程并发执行。
- 可伸缩性:适应不同规模的堆内存,性能随堆增大线性扩展。
-
适用场景:
- 实时系统(如金融交易、游戏服务器)。
- 大数据处理、云原生应用。
- 需要大内存且对延迟敏感的场景。
二、ZGC的工作过程
ZGC的垃圾回收周期分为四个主要阶段,均以并发或短暂STW方式执行:
-
初始标记(Initial Mark):
- 短暂STW:暂停所有应用线程,扫描根对象(如线程栈、静态变量)。
- 快速确定存活对象的初始集合。
-
并发标记(Concurrent Mark):
- 并发执行:遍历对象图,标记所有可达对象。
- 使用读屏障(Load Barrier)捕获应用线程访问对象时的引用变化,确保标记准确性。
-
再标记(Remark):
- 极短STW:处理在并发标记期间遗漏的引用变更(如弱引用处理)。
- 通常停顿时间极短,仅需处理残留变更。
-
并发转移准备与转移(Concurrent Relocation):
- 转移准备:选择需要压缩(Compaction)的内存区域,减少碎片。
- 并发转移:将存活对象复制到新内存地址,同时更新引用(通过读屏障处理旧引用访问)。
三、ZGC的核心原理
-
染色指针(Colored Pointers):
- 指针元数据嵌入:在64位指针的高位存储状态信息(如标记、重定位状态),利用虚拟地址的未使用位(如42位寻址,剩余22位用于元数据)。
- 元数据用途:
- Marked0/Marked1:标记对象存活状态。
- Remapped:标识对象是否被转移。
- Finalizable:处理终结器(Finalizer)。
-
读屏障(Load Barrier):
- 触发时机:当应用线程从堆中读取对象引用时,触发屏障逻辑。
- 功能:
- 检查指针元数据,若对象待转移,则触发转移并更新引用。
- 确保应用线程始终访问正确的对象地址,解决并发转移导致的引用不一致问题。
-
内存多映射(Multi-Mapping):
- 虚拟内存映射:同一物理内存映射到多个虚拟地址空间,支持染色指针的快速重映射。
- 允许不同颜色的指针(如旧地址与新地址)指向同一对象,简化转移过程。
-
并发处理策略:
- 无分代设计:全堆管理,避免分代带来的复杂度。
- 增量压缩:按需选择小部分区域进行压缩,避免全局STW。
四、ZGC的优势与限制
-
优势:
- 停顿时间可预测且极低,适合延迟敏感场景。
- 堆大小对停顿时间影响极小。
- 高效处理内存碎片,避免Full GC。
-
限制:
- CPU开销:并发阶段占用额外CPU资源。
- 暂不支持分代:可能产生更多浮动垃圾(但未来版本计划支持分代)。
- 64位系统专属:依赖染色指针,需64位架构及Linux/macOS/Windows支持。
五、启用与调优
- 启用ZGC:JVM参数
-XX:+UseZGC(Java 11+)。 - 调优参数:
-Xmx:设置最大堆大小。-XX:ConcGCThreads:调整并发GC线程数。-XX:SoftMaxHeapSize:控制堆增长上限。
ZGC通过染色指针和读屏障等创新技术,重新定义了垃圾收集器的低延迟边界,尤其适合现代大规模、高响应要求的应用场景。其设计平衡了并发处理与停顿时间,是JVM内存管理的重要进步。