G1,最大的特点是什么,标记位图,卡表卡页,SATB又分别是什么?
G1 垃圾收集器的核心特点与关键技术解析
一、G1(Garbage-First)的最大特点
G1 是 JDK 9 及之后版本的默认垃圾收集器,其核心设计目标是 高吞吐量 与 可预测的低停顿时间(STW)。最大特点总结为以下四点:
-
Region 化内存布局
- 将堆划分为多个大小相等的 Region(默认 2048 个,每个 Region 大小为 1MB~32MB),每个 Region 可以是 Eden、Survivor、Old 或 Humongous(大对象)类型。
- 物理不分代,逻辑分代:通过动态分配 Region 类型实现分代逻辑,避免传统分代收集器的内存碎片问题。
-
可预测的停顿模型
- 通过 停顿时间目标(
-XX:MaxGCPauseMillis
,默认 200ms)控制垃圾回收时间。 - 每次回收优先选择 垃圾比例最高(Garbage-First)的 Region 进行回收,确保在有限时间内回收最多垃圾。
- 通过 停顿时间目标(
-
并发与并行结合的回收机制
- 并发标记:与应用程序线程并发执行,标记存活对象。
- 并行回收:多线程并行清理垃圾 Region。
-
混合回收模式
- 结合 Young GC 和 Mixed GC:
- Young GC:回收 Eden 和 Survivor Region。
- Mixed GC:在 Young GC 后,选择性回收 Old Region(基于设定的停顿时间)。
- 结合 Young GC 和 Mixed GC:
二、关键技术细节
1. 标记位图(Mark Bitmap)
- 作用:在并发标记阶段记录对象的存活状态。
- 实现原理:
- 每个 Region 对应一个 位图(Bitmap),每个位(bit)代表 Region 内一个对象的存活状态(1 为存活,0 为可回收)。
- 通过位图快速定位存活对象,避免全堆扫描。
- 优势:内存占用小(位图压缩存储),支持快速标记与清理。
2. 卡表(Card Table)与卡页(Card Page)
- 卡表的作用:记录跨代引用,优化垃圾回收的扫描范围。
- 传统分代 GC 中,老年代对象可能引用新生代对象(跨代引用)。为避免全堆扫描,卡表标记这些引用所在的区域。
- 卡页(Card Page):
- 堆内存按固定大小(如 512B)划分为卡页,卡表中每个条目(卡页)记录对应内存块是否被修改。
- 当老年代对象写入新生代对象的引用时,写屏障(Write Barrier) 会标记对应卡页为脏(Dirty)。
- G1 中的卡表优化:
- G1 通过卡表快速定位跨 Region 引用,减少扫描范围。
- 在 Mixed GC 阶段,仅需扫描被标记为脏的卡页,提升效率。
3. SATB(Snapshot-At-The-Beginning)
- 问题背景:在并发标记阶段,应用程序可能修改对象引用关系,导致标记结果不准确(例如:已标记的对象变为垃圾)。
- SATB 的核心思想:
- 在并发标记开始时,对堆中存活对象建立一个 逻辑快照。
- 即使对象在标记过程中变为垃圾,仍被视为存活,确保本轮标记的正确性。
- 实现机制:
- 写屏障 + SATB 队列:当对象引用被修改时(如
a.x = b
),原始引用(a.x
的旧值)会被记录到 SATB 队列。 - 并发标记结束后,需处理 SATB 队列中的残留引用,避免漏标。
- 写屏障 + SATB 队列:当对象引用被修改时(如
- 优点:避免漏标(对象被错误回收),但可能产生 浮动垃圾(需在下一次 GC 回收)。
三、G1 与其他收集器的对比
特性 | G1 | CMS | ZGC |
---|---|---|---|
内存布局 | Region 化堆 | 传统分代 | Region 化堆(动态大小) |
停顿时间控制 | 可预测(软实时) | 不可预测 | 极低停顿(10ms 以下) |
并发标记 | 支持(SATB 算法) | 支持(增量更新算法) | 支持(染色指针) |
内存碎片处理 | 通过 Region 复制消除碎片 | 需 Full GC 压缩 | 无碎片(指针动态重映射) |
适用场景 | 大堆内存、低延迟需求 | 中小堆、低延迟 | 超大堆(TB 级)、超低延迟 |
四、G1 调优关键参数
-
基础配置:
-XX:+UseG1GC
:启用 G1。-XX:MaxGCPauseMillis=200
:设定最大停顿时间目标。-XX:G1HeapRegionSize=32M
:设置 Region 大小(需为 2 的幂)。
-
并发标记优化:
-XX:InitiatingHeapOccupancyPercent=45
:触发并发标记的老年代占用阈值。-XX:G1ReservePercent=10
:预留空闲 Region 比例,避免晋升失败。
-
混合回收控制:
-XX:G1MixedGCLiveThresholdPercent=85
:仅回收存活对象低于 85% 的 Old Region。-XX:G1MixedGCCountTarget=8
:混合 GC 最多执行次数。