Java对象生命周期始于堆内存分配,经创建、使用、可达性分析至垃圾回收结束。①创建时JVM在Eden区分配内存并初始化;②使用阶段对象由引用维持强可达;③GC Roots出发的可达性分析标记不可达对象;④垃圾收集器回收内存,新生代对象晋升老年代后最终被Major GC或Full GC清理。合理管理引用可避免内存泄漏。

Java对象的生命周期从创建到销毁,完整地发生在JVM堆内存中。理解这一过程有助于优化程序性能、避免内存泄漏。整个周期可分为四个阶段:创建、使用、可达性分析与垃圾回收、最终回收。下面详细解析每个环节的关键机制。
对象的创建与内存分配
当使用new关键字创建对象时,JVM首先在堆中为该对象分配内存空间。分配方式通常有指针碰撞或空闲列表两种,取决于所使用的垃圾收集器和堆内存布局。
- 类加载完成后,JVM知道对象所需大小,随即在Eden区申请空间
- 若对象较大或TLAB(线程本地分配缓冲)不足,可能直接进入老年代
- 内存分配后,对象字段会被初始化为默认值(零值),然后执行构造函数完成初始化
对象的使用与引用关系
对象创建后进入活跃使用阶段,其状态由程序逻辑控制。此时对象处于“强可达”状态,GC不会回收。
- 局部变量、静态字段、实例字段等持有的引用使对象保持可达
- 多个对象之间通过引用形成图结构,GC根节点可追溯到的对象均被视为存活
- 合理管理引用,及时置为null或脱离作用域,有助于尽早释放资源
可达性分析与垃圾判定
JVM通过可达性分析算法判断对象是否需要回收。以GC Roots为起点,向下搜索引用链,未被访问到的对象标记为不可达。
立即学习“Java免费学习笔记(深入)”;
- 常见的GC Roots包括:虚拟机栈中的本地变量、方法区中的静态引用、本地方法栈中的JNI引用等
- 一次标记-清除过程中,不可达对象会先被标记,再进行筛选是否需要执行finalize()方法
- 只有完全不可达且无需执行finalize()的对象才会被判定为可回收
垃圾回收与内存释放
当对象被判定为垃圾后,由垃圾收集器在合适的时机回收其占用的内存。
- 新生代对象通常经历多次Minor GC后仍存活,则晋升至老年代
- 老年代触发Major GC或Full GC时,对长期存活对象再次检查并回收死亡对象
- 不同收集器(如G1、CMS、ZGC)采用不同策略回收内存,但目标一致:释放空间并整理堆
基本上就这些。对象生命周期虽由JVM自动管理,但开发者仍需关注引用持有时间、避免循环引用、合理使用软/弱/虚引用,才能有效控制内存使用。理解堆中对象的流转路径,是编写高效Java程序的基础。










