java虚拟机-ZGC

88 阅读3分钟

ZGC(Z Garbage Collector)是Oracle开发的一种低延迟垃圾收集器,旨在实现亚毫秒级停顿时间,同时支持多TB级堆内存。以下是其详细介绍、工作过程及核心原理:


一、ZGC简介

  • 设计目标

    • 超低停顿:将停顿时间(STW)控制在10ms以下,甚至亚毫秒级。
    • 大堆支持:高效管理数TB级别的堆内存,适合现代内存密集型应用。
    • 并发性:几乎所有阶段(标记、转移、重定位)均与应用程序线程并发执行。
    • 可伸缩性:适应不同规模的堆内存,性能随堆增大线性扩展。
  • 适用场景

    • 实时系统(如金融交易、游戏服务器)。
    • 大数据处理、云原生应用。
    • 需要大内存且对延迟敏感的场景。

二、ZGC的工作过程

ZGC的垃圾回收周期分为四个主要阶段,均以并发短暂STW方式执行:

  1. 初始标记(Initial Mark)

    • 短暂STW:暂停所有应用线程,扫描根对象(如线程栈、静态变量)。
    • 快速确定存活对象的初始集合。
  2. 并发标记(Concurrent Mark)

    • 并发执行:遍历对象图,标记所有可达对象。
    • 使用读屏障(Load Barrier)捕获应用线程访问对象时的引用变化,确保标记准确性。
  3. 再标记(Remark)

    • 极短STW:处理在并发标记期间遗漏的引用变更(如弱引用处理)。
    • 通常停顿时间极短,仅需处理残留变更。
  4. 并发转移准备与转移(Concurrent Relocation)

    • 转移准备:选择需要压缩(Compaction)的内存区域,减少碎片。
    • 并发转移:将存活对象复制到新内存地址,同时更新引用(通过读屏障处理旧引用访问)。

三、ZGC的核心原理

  1. 染色指针(Colored Pointers)

    • 指针元数据嵌入:在64位指针的高位存储状态信息(如标记、重定位状态),利用虚拟地址的未使用位(如42位寻址,剩余22位用于元数据)。
    • 元数据用途
      • Marked0/Marked1:标记对象存活状态。
      • Remapped:标识对象是否被转移。
      • Finalizable:处理终结器(Finalizer)。
  2. 读屏障(Load Barrier)

    • 触发时机:当应用线程从堆中读取对象引用时,触发屏障逻辑。
    • 功能
      • 检查指针元数据,若对象待转移,则触发转移并更新引用。
      • 确保应用线程始终访问正确的对象地址,解决并发转移导致的引用不一致问题。
  3. 内存多映射(Multi-Mapping)

    • 虚拟内存映射:同一物理内存映射到多个虚拟地址空间,支持染色指针的快速重映射。
    • 允许不同颜色的指针(如旧地址与新地址)指向同一对象,简化转移过程。
  4. 并发处理策略

    • 无分代设计:全堆管理,避免分代带来的复杂度。
    • 增量压缩:按需选择小部分区域进行压缩,避免全局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内存管理的重要进步。