经过前面章节的学习,详细大家都知道了,Java 的对象是在堆中创建的,但堆又分为新生代和老年代,新生代又细分为 Eden、From Survivor、To Survivor。那我们创建的对象到底在哪里?

其实这部分内容我们在讲垃圾回收机制的时候提到过了,但没有细讲,这次我们就来详细讲讲。
对象优先在 Eden 分配
堆分为新生代和老年代,新生代用于存放使用后就要被回收的对象(朝生夕死),老年代用于存放生命周期比较长的对象。
我们创建的大部分对象,都属于生命周期较短的对象,所以会存放在新生代。新生代又细分 Eden、From Survivor、To Survivor,那我们创建的对象会优先在 Eden 区分配,见下图。

随着对象的不断创建,Eden 剩余地内存空间就会越来越少,随后就会触发 Minor GC,于是 JVM 会把 Eden 区存活的对象转入 From Survivor 空间。

Minor GC 后,又创建的新对象会继续往 Eden 区分配。

于是,随着新对象的创建,Eden 的剩余内存空间就会越来越少,又会触发 Minor GC,此时,JVM 会对 Eden 区和 From Survivor 区中的对象进行存活判断,对于存活的对象,会转移到 To Survivor 区。

下一次 Minor GC,存活的对象又会从 To 到 From,这样就总有一个 Survivor 区是空的,而另外一个是无碎片的。
大对象直接进入老年代
对于上面的流程,也有例外的存在,如果一个对象很大,一直在 Survivor 空间复制来复制去,就会很浪费性能,所以这些大对象会直接进入老...
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复