是的,java 对象优先在 eden 区分配。当 jvm 启动并初始化堆内存后,新创建的对象会直接尝试在 eden 区的伊甸园空间中进行内存分配,只有当 eden 区空间不足时,才会触发 minor gc(年轻代垃圾回收),将存活的对象复制到 survivor 区。

Eden 区与 Survivor 区的比例关系是怎样的
Eden 区与 Survivor 区的默认比例通常是 8:1:1,即 Eden 占年轻代的 80%,两个 Survivor 区各占 10%。这种设计是为了最大化利用内存空间进行对象分配,减少因空间不足而频繁触发垃圾回收的概率。通过调整 -XX:SurvivorRatio 参数可以改变这一比例,但通常不建议随意修改,除非有特定的业务场景需要优化。

public class MemoryAllocationDemo { public static void main(String[] args) { // 模拟大量对象创建,触发 Eden 区分配和 Minor GC for (int i = 0; i < 1000000; i++) { new byte[1024]; } }}对象何时会被晋升到老年代
对象并非永远停留在年轻代,当对象在 Survivor 区经过多次垃圾回收仍然存活,并且达到一定的年龄阈值时,就会被晋升到老年代。默认的年龄阈值是 15 岁,可以通过 -XX:MaxTenuringThreshold 参数进行调整。此外,如果 Survivor 区空间不足以容纳所有存活的对象,也会发生提前晋升,直接将对象放入老年代。
立即学习“Java免费学习笔记(深入)”;

public class PromotionDemo { public static void main(String[] args) { // 设置较小的堆大小以观察晋升行为 // -Xms10m -Xmx10m -XX:+PrintGCDetails byte[] buffer = new byte[1024 * 100]; // 100KB for (int i = 0; i < 10; i++) { buffer = new byte[1024 * 100]; } }}


















