代际假说直接驱动jvm堆结构与回收策略:弱分代假说支撑新生代采用复制算法高效处理“朝生夕死”对象,强分代假说指导老年代降低扫描频率、选用标记-整理/清除算法;二者共同定义对象年龄、晋升机制及跨代引用优化,是分代收集的工程基石。

代际假说不是抽象理论,而是直接驱动JVM堆结构划分和回收策略选择的工程依据。它把程序运行中观察到的客观规律,转化成可落地的内存管理规则。
弱分代假说:聚焦“快死”的对象,用复制算法高效清理
98%以上对象在首次GC时就该被回收——这个数据让JVM设计者果断把新分配对象集中放在新生代,并采用标记-复制算法。
- Eden区负责快速分配,Survivor区轮换存放幸存对象,只搬存活的、不扫死亡的,省时省力
- Minor GC频次高但停顿短,因为处理的是小空间+少量存活对象
- TLAB(线程本地分配缓冲)进一步减少并发分配竞争,延续“快进快出”逻辑
强分代假说:放过“难死”的对象,降低扫描频率与开销
熬过多次GC的对象大概率会长期存在——这解释了为什么老年代不频繁扫描,也不用复制算法。
- 老年代对象密度高、存活率高,复制成本远超收益,改用标记-整理或标记-清除更合理
- Major GC触发条件更苛刻(比如老年代使用率超阈值),避免无谓开销
- 大对象或长期缓存(如Spring单例、静态Map)自然落入老年代,符合其生命周期特征
代际之间不是隔离,而是有明确晋升与交互规则
两个假说共同定义了“年龄”这个关键维度:对象每熬过一次Minor GC,年龄+1;达到阈值(如默认15)或大小超标,就晋升到老年代。
- 晋升机制是连接两个假说的枢纽:既承认新生代对象大多短命,也尊重少数对象的长期存活事实
- G1、ZGC等新型收集器虽打破物理分代,但仍保留逻辑代际概念——比如G1按Region垃圾密度调度,本质仍是优先处理“年轻”且“垃圾多”的区域
- 跨代引用(如老年代对象引用新生代)通过卡表(Card Table)优化扫描范围,避免每次Minor GC都遍历整个老年代
不是所有对象都严格守规矩,所以需要弹性机制
实际应用中总有例外:大对象直接进老年代(避免复制开销),动态年龄判定(Survivor空间不足时提前晋升),甚至元空间脱离堆管理——这些都不是对假说的否定,而是基于假说主干做的务实补充。
- 分代是经验法则,不是数学定理;JVM调优的本质,就是观察你的应用是否偏离了这两个假说,并调整参数去适配
- 比如一个缓存服务大量使用SoftReference,对象存活时间变长,可能就需要调大Survivor比例或降低晋升年龄
- 又比如日志系统频繁创建短生命周期字符串,但受StringTable影响,部分可能滞留更久——这时关注元空间和字符串常量池更有效










