分代收集理论是指导jvm内存管理的核心原则,它依据弱分代假说划分新生代(eden+s0/s1)并采用复制算法实现高效minor gc,依强分代假说将长期存活对象存入老年代并用标记-清除/整理算法回收,再借跨代引用假说通过卡表与写屏障优化gc roots扫描范围,最终支撑各类回收器实现与调优策略。

分代收集理论不是具体算法,而是一套基于对象生命周期规律的指导原则,它直接决定了JVM堆内存怎么划分、各区域用什么回收方式、GC事件如何分类,以及如何平衡效率与停顿时间。
依据弱分代假说,新生代专注“快收”
观察发现:98%以上对象在第一次GC时就死亡。这说明新创建的对象极不稳定,回收重点应放在高频、轻量、低延迟上。
- 堆被划出独立的新生代区域,专用于存放新对象
- 新生代内部再细分为 Eden + 两个 Survivor 区(S0/S1),为复制算法提供结构支撑
- Minor GC 只扫描新生代,利用标记-复制算法——只搬运存活对象,清空整块 Eden 和 From 区,效率高、STW 短
- 对象每熬过一次 Minor GC,年龄+1;达到阈值(默认15)就晋升到老年代
依据强分代假说,老年代侧重“稳守”
长期存活的对象(如单例、缓存、静态集合)往往贯穿整个应用生命周期,回收频率低、存活率高,不适合频繁复制。
- 老年代不设复制空间,避免大对象反复搬运带来的开销
- 采用标记-清除或标记-整理算法:前者适合碎片压力小的场景,后者能压缩内存、避免碎片化
- Major GC 或 Full GC 触发条件更严格(如老年代空间不足、晋升失败、元空间不足等),避免无谓扫描
靠跨代引用假说,解决代间可达性难题
老年代对象引用新生代对象的情况极少,但若每次 Minor GC 都要扫描整个老年代确认引用关系,代价太高。
- JVM 引入记忆集(Remembered Set)和卡表(Card Table)机制
- 把老年代按固定大小(如512字节)划分为“卡”,只记录哪些卡内存在跨代引用
- Minor GC 时,仅将这些“脏卡”中的老年代对象加入 GC Roots,大幅缩小扫描范围
- 写屏障(Write Barrier)在赋值操作时同步更新卡表,保证精度
让回收行为可预测、可配置、可演进
分代结构天然支持不同回收器的差异化实现,也支撑了现代调优手段。
- 通过 -XX:NewRatio 控制新生代与老年代比例,-XX:SurvivorRatio 调整 Eden 与 Survivor 比例
- G1 收集器虽打破物理分代,但仍保留逻辑分代概念,用 Region 划分+Remembered Set 实现混合回收
- ZGC/Shenandoah 等低延迟收集器,也在分代思想基础上重构并发标记与重定位逻辑
- 所有 GC 日志中的 Young GC / Old GC / Mixed GC / Full GC 分类,根源都来自分代设计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











