g1收集器通过region级复制算法在每次gc中天然完成内存整理,无需传统合并操作;存活对象被复制到新region,原region整体释放,空闲region连续干净;借助rset实现跨region引用管理,保障回收局部性与独立性;mixed gc优先回收高垃圾率old region,隐式优化内存布局;碎片控制依赖region大小、ihop阈值及mixed gc频率调优。

G1 收集器本身不依赖传统意义上的“内存块合并”操作(比如 CMS 那样在 Full GC 时集中压缩),而是通过 Region 级别的复制算法 + 整体标记-整理语义,在每次回收过程中天然完成空间整理,从而避免碎片累积。
Region 复制即整理
G1 对每个待回收的 Region(无论属于 Eden、Survivor 还是 Old),都采用复制算法:将存活对象复制到新的 Region 中,原 Region 直接整体释放。这意味着:
- 回收后空出的 Region 是完全连续、干净的内存块;
- 无需额外“合并”步骤,也不存在传统堆中相邻空闲块需手动拼接的问题;
- 大对象(Humongous)若被回收,其占用的连续 Humongous Region 也会一并归还为 Free Region。
跨 Region 引用管理保障局部性
为了避免年轻代 GC 时扫描整个老年代,G1 使用 Remembered Set(RSet) 记录跨 Region 的写屏障引用。这使得:
- Young GC 只需检查 RSet 中指向当前 Eden 的老年代引用,无需全堆扫描;
- Region 回收决策独立,不依赖相邻 Region 状态,也无需等待“合并窗口”;
- 逻辑上分散的 Region 在回收后统一进入 Free List,由分配器按需调度,等效于动态维护了一组可用内存块池。
混合回收(Mixed GC)隐式优化布局
Mixed GC 不仅清理年轻代,还会选择一批垃圾比例高、回收收益大的 Old Region 一起回收。这个过程:
- 优先清理零散分布但高垃圾率的 Old Region,间接提升剩余 Old 区域的存活对象密度;
- 存活对象被复制到 Survivor 或新 Old Region,自然形成更紧凑的内存布局;
- 配合
-XX:G1HeapWastePercent控制回收阈值,避免过度回收,也防止因激进清理导致频繁 Region 分配抖动。
无显式合并,但有全局碎片控制机制
G1 不提供类似 -XX:+UseCMSCompactAtFullCollection 的显式压缩开关,因为它的设计目标就是不产生可积累的碎片。当出现以下情况时,说明碎片已影响分配:
- 分配大对象时找不到足够连续的 Region(尤其 Humongous 对象 > 0.5 × RegionSize);
- 频繁触发 Full GC(使用 MSC 算法单线程压缩整堆,是 fallback 而非常态);
- 日志中出现
to-space exhausted或evacuation failure。
此时应优先调优 Region 大小(-XX:G1HeapRegionSize)、IHOP 阈值或 Mixed GC 频率,而非期待“合并”动作——G1 的整理,就发生在每一次 Young 和 Mixed GC 的复制过程中。











