G1 是 Java 9+ 默认 GC,但大多数人只会用默认参数。G1 的 Region 模型怎么工作?Mixed GC 什么时候触发?RSet 有什么用?深入 G1 底层,才能真正做到调优。
一、G1 Region 模型
1.1 Region 划分
G1 将堆划分为 2048 个大小相等的 Region(默认)
堆大小 4GB:Region = 4GB / 2048 = 2MB
堆大小 8GB:Region = 8GB / 2048 = 4MB
堆大小 16GB:Region = 16GB / 2048 = 8MB
Region 大小自动计算,也可手动指定:
-XX:G1HeapRegionSize=8m (必须是 2 的幂,1-32MB)
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ E │ E │ S │ O │ O │ H │ H │- H-│ O │ E │
├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
│ O │ E │ E │ O │ S │ O │ H │ O │ E │ O │
├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
│ E │ O │ O │ E │ O │ O │ E │ O │ S │ O │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
E = Eden Region(新生代 Eden)
S = Survivor Region(新生代幸存者)
O = Old Region(老年代)
H = Humongous Region(大对象)
Free = 未分配 Region
Region 角色不是固定的:
一个 Region 这一轮是 Eden,GC 后可能变成 Old
G1 通过标记位跟踪每个 Region 的角色
2026/7/2大约 9 分钟