Skip to content

G1垃圾回收器

一、基础概述

  1. 适用范围:统一管理新生代与老年代,JDK9及以上默认垃圾回收器;
  2. 堆分区设计:将整个堆切分为大量大小相等的独立Region,Region动态承担Eden、Survivor、Old、Humongous四种角色;
    • Humongous区域:专门存放超大对象;
  3. 核心算法:新生代回收使用复制算法;
  4. 设计目标:兼顾吞吐量与低延迟,可自定义预期最大STW停顿时间;
  5. 风险点:并发标记阶段回收速度跟不上对象创建速度,并发失败会触发FullGC,长STW。

二、堆Region分区模型

整块堆切割为若干相同尺寸Region,无固定新生代、老年代边界:

  1. Eden Region:新对象分配区域;
  2. Survivor Region:MinorGC存活对象复制存放区;
  3. Old Region:长期存活晋升对象;
  4. Humongous Region:连续多个Region组合,存储超过Region一半大小的大对象。

三、三大回收阶段完整流程

1. Young Collection(新生代回收,MinorGC)

  1. 空闲Region划分为Eden区,所有新建对象分配在Eden;
  2. Eden内存耗尽触发MinorGC,STW暂停用户线程;
  3. 挑选空闲Region作为Survivor,采用复制算法转移Eden+旧Survivor存活对象;
  4. 存活对象年龄达标则直接晋升至Old Region,清空原Eden与旧Survivor;
  5. 交换Survivor角色,完成新生代回收。

2. Young Collection + Concurrent Mark(新生代回收+并发标记)

多次MinorGC后启动并发标记流程,目标标记全部老年代存活对象:

  1. 并发标记:GC线程与业务线程并发运行,遍历所有引用链;
  2. Remark(重新标记):短暂STW,修正并发期间新增、变动对象,消除浮动垃圾;
  3. 标记完成后统计每个Old Region回收收益(垃圾占比越高收益越高),为混合收集做准备。

3. Mixed Collection(混合回收,G1特有)

并发标记结束后执行Mixed GC,一次性回收全部新生代 + 多片高收益老年代Region:

  1. 根据预设停顿时间,优先选择垃圾多、存活少的Old Region;
  2. 将Eden、Survivor、选中Old Region中的存活对象统一复制到空闲Survivor;
  3. 清空所有参与回收的Region,释放连续空闲内存;
  4. 本轮混合收集结束,回到新生代回收循环。

四、优缺点

优点

  1. 分区化回收,可控制STW停顿,平衡延迟与吞吐量;
  2. 不产生大量连续内存碎片,回收后空闲Region分散复用;
  3. 内置Humongous分区,专门优化超大对象分配;
  4. Mixed GC同时处理新生代+部分老年代,减少FullGC概率。

缺点

  1. 并发标记占用额外CPU资源;
  2. 并发标记失败时会触发FullGC,全堆回收停顿极长;
  3. 分区维护、回收收益计算存在额外内存开销。

五、面试简答

问:详细介绍G1垃圾回收器?

答:G1是JDK9默认回收器,统一管理新生代与老年代,把堆划分为多个Region,分为Eden、Survivor、Old、Humongous大对象分区。 整体分为三大阶段:

  1. Young Collection:新生代MinorGC,复制算法,STW,存活对象晋升老年代;
  2. 并发标记:后台遍历老年代存活对象,最后Remark短暂STW修正漏标对象;
  3. Mixed Collection:G1独有混合回收,一次性回收新生代+收益最高的老年代分区,可控停顿。 G1兼顾吞吐量与低延迟,但若并发标记速度跟不上对象创建,会触发FullGC造成长时间暂停。

Powered by VitePress 1.6.4 | 持续更新中