G1收集器将分代从物理结构变为逻辑标签,堆被划分为多个独立Region,每个Region可动态承担不同角色;回收按价值而非代际进行,Mixed GC可混合回收各代Region;RSet支持跨Region引用,大对象通过Humongous Region绕过分代流程。

G1收集器打破传统分代收集界限,核心在于它把“分代”从物理结构变成了运行时的逻辑标签——堆不再被硬性切成新生代和老年代两块连续内存,而是统一划分为多个大小相等、彼此独立的 Region,每个 Region 在不同时间可动态承担 Eden、Survivor、Old 或 Humongous 角色。
Region 替代固定分区,解耦地址与代际
传统收集器(如 Parallel、CMS)要求 Eden、S0、S1、Old 必须是地址连续、大小固定的内存段;G1 则将整堆切分为约 2048 个 Region(默认大小由堆总容量自动推导,范围 1MB~32MB),它们在内存中物理分散、无顺序依赖。一个 Region 今天是 Eden,一次 Young GC 后清空,明天可能被选为 Survivor,再下次直接晋升为 Old——角色切换不靠挪动内存块,而靠头部元数据实时标记其当前逻辑身份。
回收不再按“代”执行,而是按“价值”选区
G1 不再有“这次只扫新生代”的强制约定。它维护一个回收价值排序列表(Collection Set 候选集),价值 = 预计释放空间 ÷ 预估耗时。Mixed GC 阶段可同时选取若干 Eden Region、部分 Survivor Region 和一批垃圾密度高的 Old Region 一起回收——只要它们组合后满足停顿目标(-XX:MaxGCPauseMillis)。这意味着老年代的某些区域,可能比新生代的某些区域更早、更频繁地被清理。
RSet 支撑跨 Region 引用,消除物理边界依赖
Region 物理分散后,跨代引用识别会失效。G1 为每个 Region 配备独立的 Remembered Set(RSet),记录“哪些其他 Region 中的对象引用了本 Region 的对象”。写屏障在对象赋值时增量更新 RSet,使得 GC 回收某个 Region 时,只需扫描它的 RSet 就能获取全部外部根引用,无需遍历整个老年代或新生代。这使“分代”彻底退化为逻辑视图,而非物理约束。
大对象走 Humongous 路径,绕过分代流程
当对象大小 ≥ 0.5 × RegionSize(例如 Region 为 4MB,则 ≥2MB 即为大对象),G1 直接分配连续的 Humongous Region,并将其逻辑上归入老年代管理。这类 Region 不参与复制算法,不经过 Survivor 区,也不受年龄阈值控制——它本质上是一条“代外通道”,进一步削弱了传统分代模型的刚性约束。

















