新对象优先分配到Eden区,填满时触发Minor GC;Minor GC仅清理年轻代,通过标记-复制算法将存活对象移至To Survivor区,部分对象直接晋升老年代。

当新对象被创建时,JVM 默认优先将其分配到 Eden 区(属于年轻代的一部分)。Eden 区空间有限,一旦填满,就会触发一次 Minor GC。
Minor GC 触发时机
Eden 区没有足够连续空间容纳新对象(比如要分配一个 2MB 对象,但剩余空闲内存只有 1.5MB),JVM 就会启动 Minor GC。注意:不是“用完才回收”,而是“分配失败时立即触发”。
Minor GC 的核心过程
Minor GC 只作用于年轻代(Eden + 两个 Survivor 区),不涉及老年代。它主要做三件事:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 标记存活对象:从 GC Roots(如栈帧中的局部变量、静态变量等)出发,遍历所有可达对象,标记出 Eden 和 From Survivor 中仍被引用的对象;
- 复制与整理:将所有存活对象复制到 To Survivor 区(若 To Survivor 空间不足,则直接晋升到老年代);
- 清空 Eden 和 From Survivor:复制完成后,Eden 区和原来的 From Survivor 区全部清空,然后交换 From/To 角色,为下一次 Minor GC 做准备。
对象何时进入老年代?
以下情况会导致对象在 Minor GC 过程中绕过 Survivor,直接进入老年代:
- 对象太大,无法放入任一 Survivor 区(如大数组);
- 某对象在 Survivor 区中“熬过”一定次数的 Minor GC(默认 15 次,由 JVM 参数 -XX:MaxTenuringThreshold 控制),下次 GC 时晋升;
- Survivor 区空间紧张,一批年龄相近的对象总大小超过 Survivor 的一半,JVM 会把大于该阈值的所有同龄对象批量晋升(动态年龄判断)。
Minor GC 后的内存分布
一次 Minor GC 完成后:
- Eden 区完全为空;
- From Survivor 区被清空;
- 存活对象集中在 To Survivor 区(并年龄 +1);
- 部分对象因上述原因直接进入老年代。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










