外观
一句话答案
G1 将堆划分为等大 Region,优先回收垃圾最多的 Region(Garbage First),兼顾吞吐和停顿,JDK9+ 默认收集器。
核心要点
关键概念:
Remembered Set(RSet):
- 每个 Region 都有一个 RSet,记录哪些其他 Region 引用了本 Region 的对象
- 用途:Minor GC 时,不需要扫描整个老年代,只需扫描 RSet 中记录的引用
- 代价:RSet 的维护有额外内存开销(约 10%~20%)
Card Table:
- 老年代被划分为 512 字节的 Card,Card Table 记录哪些 Card 是"脏的"(被修改过)
- 用于精确定位哪些老年代位置引用了年轻代对象
Humongous Region:
- 大对象(>= Region 大小一半)直接分配到 Humongous Region
- 跨多个 Region 连续分配
- GC 时在 Old GC 阶段处理
G1 的停顿预测模型:
- G1 记录每个 Region 的回收时间和可回收垃圾量
- 根据
-XX:MaxGCPauseMillis目标,选择在目标时间内能回收最多垃圾的 Region 集合 - "Garbage First" 名字来自于优先回收垃圾占比最高的 Region
追问与易错
追问方向:
- G1 的 Region 大小怎么确定?(1-32MB,默认堆/2048 个 Region)
- Mixed GC 和 Full GC 的区别?(Mixed 选择部分 Region,Full 回退 Serial Old)
- G1 怎么处理跨 Region 引用?(Remembered Set,卡表记录跨区引用)
易错点:
- ❌ "G1 不会 Full GC"——如果回收速度跟不上分配速度,会退化为 Full GC
- ❌ 混淆 Young GC 和 Mixed GC——Mixed GC 包含部分老年代 Region
💡 记忆锚点
G1把堆切成2048块棋盘格(Region),每轮挑垃圾最多的格子优先回收——"垃圾优先"得名于此。RSet记录谁引用了我(免全堆扫描),停顿预测模型保证在目标时间内收最多垃圾。大对象住Humongous专区。