新创建的对象默认在eden区分配。eden区是年轻代的一部分,对象优先在此分配,通过tlab或指针碰撞快速完成;空间不足时触发minor gc,大对象则直接进入老年代。

新创建的对象默认在 Eden 区分配,这是 JVM 堆内存中年轻代(Young Generation)的一部分。Eden 区是对象诞生的第一站,绝大多数对象在此“出生”,并在后续 GC(通常是 Minor GC)中被快速回收。
对象如何进入 Eden 区
当执行 new 指令创建对象时,JVM 会尝试在 Eden 区的空闲内存中连续分配所需空间:
- 如果 Eden 区有足够连续空间(由 TLAB 或全局指针决定),直接分配并初始化对象,整个过程非常快;
- 若 Eden 空间不足,会先触发一次 Minor GC,清理掉大量已死亡对象,腾出空间后再尝试分配;
- 若 GC 后仍无法容纳该对象(比如对象过大),则直接绕过 Eden,分配到老年代(通过 大对象直接进入老年代策略,如 -XX:PretenureSizeThreshold 设置)。
Eden 区的空间管理机制
Eden 并非简单按顺序填满,而是依赖两种关键机制高效管理:
- TLAB(Thread Local Allocation Buffer):每个线程私有的小缓存区,从 Eden 中预先划出。线程在自己 TLAB 内分配对象无需加锁,大幅提升并发分配效率;
- Eden 的 bump-the-pointer(指针碰撞):在无垃圾回收、内存规整的前提下,只需移动一个指针(如 top 指针)即可完成分配,开销极小。
什么情况下对象不进 Eden
并非所有对象都走 Eden 路径:
- 显式指定大对象(超过 -XX:PretenureSizeThreshold 阈值)→ 直接分配到老年代;
- 某些动态语言运行时或反射场景下,JVM 可能根据对象生命周期预测跳过 Eden;
- 开启 -XX:+UseZGC 或 -XX:+UseShenandoah 时,部分分配策略可能调整,但 Eden 概念在 ZGC/Shenandoah 中已弱化(因其不分代);
- 对象在栈上逃逸分析后被优化为标量替换(即不分配内存),自然也不涉及 Eden。
Minor GC 前 Eden 区的状态特征
在下一次 Minor GC 触发前,Eden 区通常呈现以下状态:
- 大部分对象是“朝生夕死”的短命对象(如循环中的临时字符串、包装类等);
- 存在少量存活对象(可能被 Survivor 区引用),但比例通常很低(HotSpot 默认 Eden:Survivor = 8:1);
- 内存布局呈碎片化趋势减弱(因分配靠指针推进,且 GC 后会整理),但未 GC 前可能有空洞(尤其 TLAB 分配不均时)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











