g1收集器采用region划分内存,通过rset精准定位跨区引用,实现增量式局部回收与低停顿。region大小1mb~32mb,最多2048个,支持最大约64gb堆;年轻代弹性伸缩,mixed gc渐进清理老年代,无full gc依赖。

G1 收集器不扫描整个堆,而是按 Region 划分内存,只处理垃圾多、价值高的区域,配合 Remembered Set(RSet)精准定位跨 Region 引用,实现局部变量的增量式扫描和低停顿回收。
Region 是 G1 的基本内存单位
堆被划分为 2048 个大小相等的 Region,默认大小为堆总容量 ÷ 2048(向上取整到 2 的幂),范围在 1MB~32MB。例如:4GB 堆 → 默认 Region 大小约 2MB。
- 每个 Region 动态扮演 Eden、Survivor、Old 或 Humongous 角色,不固定归属某一代
- Humongous Region 专用于存储 ≥ 当前 Region 50% 大小的对象(如 >1MB 的大数组)
- Region 数量上限为 2048,因此 G1 最大支持堆约 64GB(32MB × 2048)
- 年轻代由若干 Eden + Survivor Region 组成,比例默认为 8:1:1,但总量可弹性伸缩(5%~60% 堆大小)
局部变量扫描依赖 RSet 和卡表(Card Table)
局部变量本身在栈上,但其引用的对象在堆中。G1 不扫描所有栈帧,而是通过 RSet 快速识别哪些 Region 持有对当前待回收 Region 的引用,避免全堆扫描。
- 每个 Region 内部划分为 512 字节的“卡(Card)”,卡表记录哪些卡被修改过
- RSet 存储“谁指向我”——即其他 Region 中哪些卡里存在指向本 Region 的引用
- Young GC 时,仅需扫描 Eden/Survivor Region + 对应 RSet 中标记的跨 Region 引用,不遍历老年代全部对象
- RSet 更新由写屏障(Write Barrier)在对象引用赋值时异步维护,开销可控
增量回收靠 Collection Set(CSet)驱动
CSet 是 G1 后台动态维护的“待回收 Region 集合”,按“垃圾密度高、回收耗时低”排序,每次 GC 只选其中一部分执行回收,实现增量式控制停顿时间。
- Young GC:CSet 包含所有 Eden + 部分 Survivor Region
- Mixed GC:CSet 在 Young 基础上,加入部分 Old Region(根据并发标记结果和 -XX:MaxGCPauseMillis 目标动态选择)
- 回收采用复制算法,将存活对象搬入空闲 Region,天然消除碎片
- 停顿时间预测基于历史回收数据(如各 Region 扫描/复制耗时),而非理论估算
逻辑分代保留,物理布局彻底解耦
G1 仍区分年轻代与老年代语义,但不再要求连续内存。这种设计让分代假说继续生效,又摆脱了传统分代收集器的僵化约束。
- 新对象优先分配在 Eden Region;晋升阈值(-XX:MaxTenuringThreshold)控制对象何时进入 Old Region
- 老年代回收不依赖 Full GC,而是通过 Mixed GC 渐进清理,避免长时间 STW
- 没有单独的 Permanent Generation 或 Metaspace 回收逻辑——方法区(元空间)由本地内存管理,与 G1 堆无关
- Humongous Region 被视为老年代的一部分,但回收策略更激进(常随 Mixed GC 一并处理)










