jvm堆内存分代划分为年轻代和老年代,年轻代含eden区(约80%)与两个survivor区(s0/s1),用于存放短命对象并经minor gc晋升;老年代存放长期存活或大对象,满足年龄阈值、大小超限或空间不足等条件时晋升;元空间不属于堆内存。

JVM 堆内存的分代划分,核心目标是匹配对象生命周期特征,提升垃圾回收效率。它不是固定不变的物理分区,而是基于“分代收集理论”设计的逻辑结构,主要划分为年轻代(Young Generation) 和 老年代(Old Generation) 两大部分。
年轻代
专门存放新创建、大概率短命的对象。JVM默认把堆内存约 1/3 分配给年轻代(可通过 -XX:NewRatio 或 -Xmn 调整)。它内部再细分为:
-
Eden 区:绝大多数新对象在此分配,占年轻代约 80%(默认
SurvivorRatio=8,即 Eden : S0 : S1 = 8:1:1); - Survivor 区(S0 和 S1):两个大小相等、始终一空一用的区域,用于暂存 Minor GC 后存活的对象,并记录其年龄(每经历一次 Minor GC 年龄 +1)。
老年代
存放长期存活或大对象。当对象满足以下任一条件,就会进入老年代:
- 在 Survivor 区中“熬过”足够多次 Minor GC(默认年龄 ≥15,由
-XX:MaxTenuringThreshold控制); - 对象过大(超过
-XX:PretenureSizeThreshold阈值),直接绕过年轻代,分配到老年代; - Survivor 区空间不足时,部分存活对象提前晋升(动态年龄判定:同龄对象总和 ≥ Survivor 空间一半,该年龄及以上对象全部晋升);
- Minor GC 前,若老年代剩余空间不足以担保年轻代全部存活对象,也会触发提前晋升或 Full GC。
注意:元空间(Metaspace)不属于堆内存,它位于本地内存,用于存储类元数据,与年轻代/老年代无归属关系。
分代比例不是硬编码,而是可调的策略:
- 用
-XX:NewRatio=2表示老年代 : 年轻代 = 2:1(即年轻代占堆 1/3); - 更直接的方式是
-Xmn512m,明确指定年轻代大小,剩余堆空间自动归老年代; - 若应用创建大量短期对象(如 Web 请求临时对象),可适当增大年轻代比例;反之,若缓存多、对象寿命长,可减小年轻代、避免频繁晋升。
本质上,分代是 JVM 对“大多数对象朝生夕死”这一现实的工程响应——让小范围、高频率的 Minor GC 快速清理 Eden,把低频但耗时的整理工作留给老年代 GC。










