g1收集器采用逻辑分代、物理分区设计:物理上以大小相等的region为单位,动态分配eden/survivor/old角色;逻辑上仍基于分代理论指导回收,通过young gc、mixed gc实现渐进式管理,并以回收价值模型优化停顿。

G1收集器既不是完全分代,也不是彻底不分代,而是在物理结构上取消固定分代,在逻辑行为上保留分代特征——这种“逻辑分代、物理分区”的设计,是它区别于CMS、Parallel等传统收集器的核心所在。
物理上不分代:Region是基本单位
G1把整个Java堆划分为多个大小相等的独立Region(默认约2048个),每个Region大小为1MB~32MB(2的幂次),彼此物理不连续。一个Region可动态扮演Eden、Survivor或Old角色,没有预设的内存边界。这意味着:
- 不存在传统意义上连续的Eden区或Tenured区,堆内存不再被硬性切割为几大块
- 年轻代和老年代只是Region集合的逻辑标签,下次GC后某些Region的角色可能完全互换
- 大对象直接分配到Humongous Region(≥半个Region大小),绕过常规分代晋升路径
逻辑上仍分代:回收策略依赖年龄与引用
尽管物理布局松散,G1依然沿用分代理论的三大假说来指导回收决策:
- 弱分代假说:新分配对象大概率短命 → G1优先回收Eden类Region(Young GC)
- 强分代假说:存活多次的对象更稳定 → 对象在Survivor间辗转后,按年龄阈值(-XX:MaxTenuringThreshold,默认15)晋升至Old类Region
- 跨代引用假说:老年代对新生代的引用极少 → 用Remembered Set(RSet)精确记录跨Region引用,避免扫描全堆
因此,G1的“年轻代”实际是当前所有标记为Eden/Survivor的Region集合,其大小可通过-XX:G1NewSizePercent(默认5%)和-XX:G1MaxNewSizePercent(默认60%)动态调控。
混合回收(Mixed GC)体现渐进式分代管理
G1不强制区分Minor/Major GC,而是通过CSet(Collection Set)灵活组合回收目标:
- Young GC:只回收所有Eden + Survivor Region,停顿较短,频率高
- Mixed GC:在Young GC基础上,额外加入部分Old Region(依据垃圾密度和停顿预算选择),实现老年代渐进清理
- Full GC仍是兜底机制,但G1会极力避免——这正是它用“回收价值模型”替代“代边界驱动”的关键
所谓“回收价值”,即综合评估某个Region中可释放空间大小与预计耗时,按收益排序,确保每次GC都在用户设定的-XX:MaxGCPauseMillis(默认200ms)内完成最大有效回收。
淡化分代不等于否定分代
G1的设计目标不是消灭分代思想,而是解耦分代与物理布局的强绑定。它承认对象生命周期差异带来的回收效率差异,但拒绝为此牺牲内存利用率和停顿可控性。例如:
- 若某次Young GC后发现大量对象晋升,G1会自动扩大年轻代Region数量,而非等待堆满才触发Major GC
- 当Old Region碎片化严重,G1可在Mixed GC中同步进行局部整理(类似Compact),避免CMS的碎片化崩溃风险
- 没有永久代/元空间的特殊处理,但Metaspace本身不受G1管理,这点与所有HotSpot收集器一致
这种“用分代逻辑驱动,以Region粒度执行”的折中路径,让G1在大堆(数十GB)、低延迟(百毫秒级)场景下保持了极强的适应力。











