对象默认分配在新生代eden区;hotspot默认新生代中eden与两个survivor区比例为8:1:1,新对象优先在eden分配,大对象、逃逸分析优化对象或晋升对象可能绕过eden直接进入老年代或栈上。

Java 中对象内存分配和垃圾回收是一体两面的过程:对象在堆中诞生,而垃圾回收器在背后默默清理不再存活的对象。整个过程由 JVM 自动完成,开发者无需手动申请或释放内存。
对象默认在哪分配?
绝大多数新创建的对象都分配在新生代的 Eden 区。HotSpot JVM 默认将新生代划分为 Eden 和两个 Survivor 区(From/To),比例为 8:1:1。使用 new 创建对象时,JVM 首先尝试在当前线程的 TLAB(Thread Local Allocation Buffer)中快速分配——这是 Eden 内一块线程私有缓存区,避免并发加锁开销。
以下情况会绕过 Eden:
- 大对象(如大数组)可能直接进入老年代,避免在新生代反复复制;
- 逃逸分析确认未逃逸的方法内对象,JIT 编译器可能优化为栈上分配或标量替换(不分配对象实体);
- 多次 Minor GC 后仍存活的对象,按年龄阈值(默认 15)晋升至老年代。
怎么判断一个对象该被回收?
JVM 不用引用计数法(因无法解决循环引用),而是采用可达性分析算法。它从一组称为 GC Roots 的对象出发,沿着引用链向下搜索:
- 虚拟机栈中局部变量引用的对象;
- 方法区中静态变量引用的对象;
- 方法区中常量池引用的对象;
- 本地方法栈中 JNI 引用的对象。
如果一个对象到任意 GC Root 都没有引用链可达,它就被标记为“不可达”,成为候选垃圾。
垃圾回收是怎么执行的?
主流 GC 算法不是孤立使用的,而是基于分代收集理论组合运作:
- Minor GC:发生在新生代,常用复制算法(Eden + From → To),速度快、停顿短;
- Major / Full GC:涉及老年代(有时含整个堆),常用标记-整理或标记-清除,耗时长、影响大;
- G1、ZGC、Shenandoah等新型收集器则打破分代物理界限,以区域(Region)为单位管理,支持可预测停顿时间。
GC 触发时机包括 Eden 空间不足、老年代空间紧张、显式调用 System.gc()(仅建议,不保证执行)等。
为什么不用手动管内存?
因为 JVM 把复杂留给了自己:TLAB 加速分配、逃逸分析优化路径、分代假设提升效率、多种 GC 算法适配不同场景。你写 new Person(),背后是内存对齐、零初始化、构造函数调用、引用入栈、GC Root 维护等一系列动作;你不再持有引用,JVM 就会在合适时机回收——只要没发生内存泄漏(如静态集合无限制增长、监听器未注销等),这套机制足够健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











