g1收集器通过region分区、复制算法、remembered set和增量整理机制在常规gc中持续控制碎片,无需传统full gc;仅在humongous分配异常、晋升失败或mixed gc延迟时需人工干预。

G1收集器本身不依赖传统意义上的“Full GC”来解决碎片问题,它通过设计机制在常规GC过程中就持续控制和缓解碎片化,这是它区别于CMS等老一代收集器的关键优势之一。
Region分区与天然抗碎片能力
G1将堆划分为固定大小的Region(默认1MB–32MB),每个Region独立管理、角色可变(Eden/Survivor/Old/Humongous)。这种结构避免了传统分代中连续大块内存被反复分配-释放导致的不规则空洞。更重要的是:
- 所有Young GC都采用复制算法:存活对象被复制到新的Survivor或Old Region,原Region直接整块释放,无残留碎片;
- Mixed GC在回收Old Region时同样使用“标记-整理”逻辑:G1会把选定Region中存活对象复制到其他空闲Region,然后清空整个源Region,实现物理空间归并;
- Humongous Region专用于超大对象(>RegionSize/2),连续分配、整块回收,避免大对象撕裂老年代造成不可用空隙。
Remembered Set与跨区引用管理
Region之间存在频繁引用(如年轻代对象引用老年代对象),若不做处理,跨区复制时无法准确定位存活对象,会导致遗漏或错误回收。G1通过Remembered Set(RSet)记录每个Region被哪些其他Region引用:
- RSet在写屏障(Write Barrier)辅助下实时更新,保证GC时能快速扫描“可能有跨区引用”的区域;
- 这使得Mixed GC无需扫描整个老年代,只检查RSet标记的少量Region,既提升效率,又避免因引用关系混乱导致的回收不彻底和隐性碎片;
- RSet本身占用额外内存(约5%堆空间),但换来的是精准回收——没有“误留”垃圾,也就没有“伪碎片”。
停顿时间模型驱动的增量式整理
G1不追求一次整理全部老年代,而是基于-XX:MaxGCPauseMillis目标动态选择回收哪些Region:
- 每次Mixed GC优先挑选“垃圾比例最高、整理收益最大”的Region集合,即所谓“Garbage-First”;
- 整理过程是增量发生的:一次GC只移动部分存活对象,不会像Serial Old那样暂停全堆做全局压缩;
- 长期运行中,随着多次Mixed GC推进,原本分散的存活对象逐步聚拢,空闲Region成片出现,自然降低碎片密度。
何时需要人工干预碎片?
尽管G1大幅弱化碎片风险,但在以下情况仍可能触发退化行为或需调优:
- Humongous对象频繁分配且大小接近Region边界:易造成多个Humongous Region零散分布,且无法被Mixed GC回收(除非其中对象全部死亡);建议监控G1HumongousAllocation日志项,必要时调大-XX:G1HeapRegionSize减少数量;
- 晋升失败(To-space Exhaustion):Survivor区不足以容纳本轮晋升对象,被迫直接进入老年代,若此时老年代已高度碎片化,可能引发并发模式失败(Concurrent Mode Failure)——这会触发单线程Full GC,带来长停顿;可通过增大堆、调高-XX:G1ReservePercent预留缓冲区缓解;
- 长期未触发Mixed GC:若应用长期处于低负载,老年代增长缓慢,G1可能延迟启动Mixed GC,导致碎片缓慢累积;可通过适当降低-XX:G1MixedGCLiveThresholdPercent(默认85%)提前介入。











