ZGC 简介

**ZGC(Z Garbage Collector)**是 Java HotSpot 虚拟机自 JDK 11 引入的一款可扩展、低延迟的垃圾回收器,专为大堆内存和对延迟极为敏感的应用场景设计。

主要特点

工作原理

  1. 并发标记:与应用线程并发,标记所有可达对象。
  2. 并发重定位:对象在后台被迁移到新内存,引用通过着色指针和读屏障自动修正。
  3. 并发清理:回收不可达对象占用的内存。
  4. 极短暂停:只有少量阶段(如初始标记、重新标记)会有极短的 STW 停顿。

启用方式

适用场景

ZGC 的垃圾回收过程

ZGC 的回收过程高度并发,主要分为以下几个阶段:

  1. 初始标记(Initial Mark)

    • 标记从 GC Roots 直接可达的对象。
    • 该阶段会有一次极短的 Stop-The-World(STW)暂停。
  2. 并发标记(Concurrent Mark)

    • 与应用线程并发执行,遍历对象图,标记所有可达对象。
    • 利用着色指针和读屏障,保证标记期间对象引用变更的正确性。
  3. 重新标记(Relocate/Remark)

    • 修正并发标记期间发生变动的对象引用。
    • 该阶段也会有一次极短的 STW 暂停。
  4. 并发重定位(Concurrent Relocate/Move)

    • 并发地将存活对象迁移到新的内存位置。
    • 通过着色指针和读屏障,确保引用始终指向最新位置。
  5. 并发清理(Concurrent Cleanup)

    • 回收不可达对象占用的内存块(Chunk),释放空间。

过程特点

ZGC 的着色指针与读写屏障

着色指针(Colored Pointers)

ZGC 利用 64 位系统对象引用的高位(未被实际寻址使用的位)来存储元数据,这些高位被称为“着色位”。通过这些着色位,ZGC 可以为每个对象引用打上不同的“颜色”,用来表示对象在 GC 各阶段的状态(如是否已被标记、是否已被转移等)。

读写屏障(Read/Write Barrier)

ZGC 在对象访问时引入了读屏障和写屏障,用于配合着色指针实现并发标记和并发重定位:

总结

通过这两项技术,ZGC 能在 TB 级堆下实现毫秒级停顿,极大提升了 Java 应用的可扩展性和实时性。


ZGC 是目前 Java 平台上延迟最低、可扩展性最强的垃圾回收器之一,适合对响应时间要求极高的业务场景。

ZGC 中存活对象的迁移

在 ZGC 中,是否迁移存活对象主要由以下因素决定:

  1. 内存碎片整理
    当堆内出现较多碎片时,ZGC 会选择迁移存活对象,将它们移动到新的连续内存块(Chunk),以整理和回收碎片空间,提高大对象分配的成功率。

  2. 内存回收策略
    ZGC 会根据当前堆的使用情况、空闲空间分布和回收效率,动态决定哪些 Chunk 需要被清理和整理。被选中的 Chunk 内的存活对象会被迁移到其他 Chunk。

  3. 并发重定位阶段
    在并发重定位(Concurrent Relocate/Move)阶段,ZGC 会将需要整理的 Chunk 内的所有存活对象迁移到新位置,并更新所有相关引用(通过着色指针和读屏障实现)。

  4. 分配需求
    当需要为新对象分配大块连续空间时,如果当前没有足够的连续空闲 Chunk,ZGC 也会主动迁移存活对象,释放出大块空间。

总结

ZGC 中 Chunk 的管理方式

ZGC 采用“Chunk”作为内存分配和管理的基本单位,整个堆空间被动态划分为多个大小不等的 Chunk。Chunk 的管理方式如下:

1. Chunk 类型

2. 动态分配与回收

3. 空闲 Chunk管理

4. Chunk 内部结构

5. 并发整理与碎片回收


总结
ZGC 通过 Chunk 的动态分配、并发管理和主动整理,有效提升了大堆场景下的内存利用率和分配效率,极大降低了碎片化风险

ZGC 与 G1 的优缺点对比

ZGC 优势

ZGC 劣势


G1 优势

G1 劣势


总结