Skip to content
极高困难

一句话答案

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专区。