文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

Java 深入浅出垃圾回收【二、G1 GC / ZGC / Shenandoah GC】

现代 GC 流程核心对比

在这里插入图片描述

1. G1 GC(Garbage First)

1.1 核心思想

  • 将堆划分为 多个大小相等的 Region(默认 1–32 MB),不再是固定的年轻代/老年代
  • 年轻代和老年代都是 Region,通过 RegionSet 动态划分
  • 混合回收 (Mixed GC):年轻代 + 部分老年代 Region 同时回收
  • 目标:可预测停顿时间,控制 STW 时间

1.2 内存结构(源码)

Heap
 ├─ Eden Regions
 ├─ Survivor Regions
 ├─ Old Regions
 └─ Humongous Regions (>1/2 Region size)

源码类关键:

  • G1CollectedHeap:G1 GC 堆入口
  • G1YoungGen / G1OldGen:年轻代/老年代管理
  • G1Region:Region 对象
  • G1Collector:主要收集器

1.3 回收流程

1.3.1 Minor GC(年轻代回收)

  1. Eden/S0/S1 对象复制

    • 使用 复制算法,存活对象复制到 Survivor 或晋升到老年代
  2. Region 空闲计算

    • 计算哪些 Region 可以回收
  3. STW 阶段

    • 暂停应用线程,执行初始标记(Root 标记)

1.3.2 Mixed GC(年轻代 + 老年代)

  1. 选择回收 Region

    • 优先回收垃圾最多的 Region
    • 使用 Region 回收优先队列
  2. 并发标记阶段

    • 遍历可达对象,标记存活对象
    • STW 初始标记 + 并发标记 + STW 重新标记
  3. 整理/搬迁

    • 将存活对象移动到其他 Region
    • 更新引用(Forwarding Table / Remembered Set)

1.3.3 Humongous Objects

  • 对象大于 1/2 Region → 分配到连续 Humongous Region

  • 处理方式:

    • Minor GC 可能直接晋升到老年代
    • Mixed GC 时单独回收

1.4 源码关键细节

  • 对象移动

    • HeapRegion::evacuate() 负责对象搬迁
    • 通过 forwarding pointer 更新引用
  • 并发标记

    • G1ConcurrentMark::mark_roots() 遍历根对象
    • G1ConcurrentMark::concurrent_mark() 并发扫描
  • STW 控制

    • -XX:MaxGCPauseMillis:目标停顿时间
    • G1CollectorPolicy::select_regions_to_collect()

2. ZGC(Z Garbage Collector)

2.1 核心思想

  • 超低延迟 (<10ms)

  • 并发、增量式

  • 支持 TB 级大堆

  • 核心技术:

    • Colored Pointers:对象头 + 指针编码状态
    • Load Barriers:对象访问时更新引用
    • Region + Relocation:并发移动对象

2.2 内存结构

  • Region 化堆:1GB-4GB 大小,按需回收

  • 虚拟空间映射 (Virtual Memory Arena):支持大堆

  • 对象状态标记

    • Blue, Green, Red 等色标识对象是否移动

2.3 回收流程(源码分析)

  1. 并发标记

    • ZMarkTask 遍历根对象
    • 使用 colored pointer 标记对象状态
  2. 并发准备搬迁

    • 计算新地址
    • 设置 forwarding pointer
  3. 对象搬迁

    • ZRelocate 并发搬迁存活对象
    • Load Barrier 确保线程访问到新地址
  4. 清理空闲 Region

    • 并发清理空闲内存

2.4 源码关键点

  • HeapRegion:ZGC 对 Region 管理
  • ZPageList:空闲页面管理
  • ZBarrierSet:Load / Store Barrier
  • ZRelocateTask:对象搬迁并更新指针

3. Shenandoah GC

3.1 核心思想

  • 并发标记 + 并发整理
  • 低停顿 (<10ms),目标大堆和延迟敏感应用
  • 支持 记忆集合 (Remembered Set),追踪跨 Region 引用

3.2 内存结构

Heap
 ├─ Eden Regions
 ├─ Survivor Regions
 ├─ Old Regions
 └─ Humongous Regions
  • 与 G1 类似,但 并发整理 替代 G1 的 STW 整理

3.3 回收流程

  1. 初始标记 (STW)

    • 标记根对象
  2. 并发标记

    • 并行扫描对象
  3. 重新标记 (STW)

    • 修正并发期间新创建或修改的对象
  4. 并发整理

    • ShenandoahEvacuation 并发搬迁存活对象
    • 更新引用
  5. Release 空闲 Region

    • 空闲内存返回 OS

3.4 源码关键点

  • ShenandoahHeap:堆入口
  • ShenandoahEvacuationSet:管理搬迁区域
  • ShenandoahBarrierSet:Load/Store Barrier
  • ShenandoahConcurrentMark:并发标记

4. 对比分析(G1 vs ZGC vs Shenandoah)

特性G1ZGCShenandoah
停顿时间可控 (~10-200ms)<10ms<10ms
堆大小Up to 32TBTB 级TB 级
对象搬迁并发 + STW完全并发完全并发
算法核心Region + Mixed GCColored pointer + Load BarrierConcurrent Compact + Barrier
优点自动碎片整理,调优灵活超低延迟,大堆支持低停顿,适合延迟敏感应用
缺点CPU 占用高,参数多内存开销大,Barrier成本调优复杂,Barrier成本

在这里插入图片描述

对象生命周期 + GC 流程可视化图

  • 同时对比 G1 / ZGC / Shenandoah 的 对象流转、Barrier 介入点、并发阶段、STW 时机。
    在这里插入图片描述

5. 调优 & 相关 JVM 参数

G1

-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:ParallelGCThreads=8
-XX:G1HeapRegionSize=16M

ZGC

-XX:+UseZGC
-XX:MaxHeapSize=512G
-XX:+UnlockExperimentalVMOptions

Shenandoah

-XX:+UseShenandoahGC
-XX:ShenandoahGCHeuristics=adaptive
-XX:ShenandoahPauses=5
posted @ 2025-09-02 11:15  NeoLshu  阅读(5)  评论(0)    收藏  举报  来源