一、G1 定位与设计目标G1 全称 Garbage-FirstJava7 开始商用Java9 默认垃圾收集器。 它核心设计目标解决之前 CMS 的痛点CMS 会产生内存碎片Full GC 停顿极长CMS 无法控制 STW 停顿时间G1 两大核心目标 ① 可预测的低停顿用户可指定期望最大 GC 停顿时间 ② 整理内存碎片尽可能避免 Full GC。二、核心思想分块化堆内存RegionG1 不再把堆固定划分为新生代 Eden/Survivor、老年代而是将整个 Java 堆切分成多个大小相等的独立 Region 区域。Region 大小固定范围 1M~32M堆内存越大单个 Region 越大Region 分 5 种类型Eden 区存放新建对象SurvivorS0/S1新生代存活对象Old 老年代区长期存活对象Humongous 巨型区存放大于单个 Region 一半大小的大对象直接分配巨型区不进 EdenEmpty 空白区空闲内存。Garbage-First 含义G1 每次 GC 时会优先回收垃圾最多的 Region回收效率最高所以叫垃圾优先收集器。三、G1 的回收流程四大阶段分混合 GCG1 大部分场景执行混合 GC替代 CMS 的并发 GC分为四个阶段初始标记STW暂停所有用户线程只标记 GC Roots 能直接引用到的对象速度很快停顿短。并发标记与用户线程并行无 STW后台线程遍历整个堆从初始标记的对象出发完整遍历可达对象同时处理并发过程中新产生的引用变动SATB 快照算法。最终标记STW短暂暂停处理并发阶段遗漏的引用变化完成全部存活对象标记。筛选回收STW核心阶段G1 根据用户设置的停顿时间挑选垃圾占比最高的一批 Region并行复制存活对象到空白 Region同时直接整理碎片 回收完成后这批 Region 直接全部释放不会产生内存碎片。四、SATB 快照算法G1 关键并发标记时用户线程还在运行对象引用会变化容易漏标存活对象。 G1 采用 SATBSnapshot At The Beginning起始快照 在标记开始时对堆做一份逻辑快照只要标记开始时存活的对象全部判定为存活解决并发漏标问题。五、G1 的优缺点优点可控 STW 停顿可通过参数-XX:MaxGCPauseMillis指定最大停顿G1 会自动调整回收 Region 数量满足预期无内存碎片回收采用复制算法存活对象复制到新 Region旧区域直接清空全程整理碎片分区域回收无需整堆扫描内存利用率更高专门优化巨型对象大对象直接放 Humongous 区避免老年代频繁 GC并发标记大部分阶段和业务线程并行降低停顿压力。缺点整体内存开销更大需要维护每个 Region 的垃圾统计、记忆集 RSet占用额外内存混合 GC 的扫描、标记计算会占用 CPU 资源当堆内存极大、存活对象极多的时候依然会触发 Full GC且 G1 的 Full GC 是单线程串行回收停顿时间非常长。六、RSet 记忆集补充高频考点每个 Region 自带 RSetRemembered Set记录其他 Region 中引用当前 Region 对象的指针。 作用做新生代 GC 时不需要扫描整个老年代找跨代引用只需要扫描 RSet大幅减少 GC 扫描范围提升效率。七、适用场景堆内存较大一般堆内存大于 4G 推荐使用 G1应用要求低延迟希望 GC 停顿可控不能出现长时间 STW业务存在大量大对象容易产生内存碎片替代 CMS规避 CMS 并发失败、碎片过多触发 Full GC 的问题。简短总结面试收尾G1 是一款面向大内存、低延迟的分代分区收集器把堆拆分成多个 Region采用复制算法消除内存碎片通过 SATB 并发标记、RSet 记忆集提升标记效率支持自定义 GC 最大停顿时间缺点是内存、CPU 开销更高极端场景下串行 Full GC 性能较差。