java堆内存划分为新生代和老年代,基于对象生命周期规律:新生代专收短命对象,采用复制算法高频回收;老年代存放长寿对象,延迟回收并注重空间利用率;两者通过年龄阈值、动态判定和大对象直接分配机制动态衔接。

Java垃圾收集器把堆内存划分为新生代和老年代,不是凭空设计的,而是基于程序中对象真实的生命周期规律。
新生代专收“短命对象”
绝大多数新创建的对象,比如方法内临时变量、HTTP请求中的DTO、循环中生成的集合元素,往往只存活几毫秒到几秒。它们在用完即弃,很快变成垃圾。新生代就是为这类对象准备的:
- 新对象默认分配在Eden区
- Minor GC频繁触发(可能一秒多次),但只扫描Eden + 一个Survivor区
- 使用复制算法:存活对象少,复制开销小,还能自动整理内存、避免碎片
老年代专存“长寿对象”
那些扛过多次Minor GC仍活着的对象,比如Spring管理的单例Bean、全局缓存、连接池、配置类实例,天然具备长期存活特征。它们被晋升到老年代:
- 不参与高频Minor GC,减少对稳定对象的打扰
- 回收时机靠后——只有老年代空间不足时才触发Major GC或Full GC
- 采用标记-清除或标记-整理算法:不追求速度,更看重空间利用率和大对象分配能力
两者通过晋升机制动态衔接
- 对象年龄达阈值(默认15次Minor GC)→ 晋升老年代
- Survivor区同龄对象总和超该区一半 → 提前晋升(动态年龄判定)
- 超过预设大小的大对象(如大数组)→ 直接进入老年代,跳过新生代流转
这种划分本质是“按需分区”:把回收成本低的操作集中在新生代,把代价高的操作尽量推迟并限制范围,从而在吞吐量和停顿时间之间取得实际可接受的平衡。











