java对象生命周期分为四个基础阶段:创建阶段(new操作触发类加载、内存分配、初始化及构造执行)、应用阶段(强可达状态,可正常访问)、不可达阶段(失去所有强引用,成为gc候选)、回收与释放阶段(gc清理内存,finalize不保证及时性)。

创建阶段(Creation)
对象真正落地堆内存的起点,发生在执行 new 操作时。JVM 会依次完成:
- 确认类已完成加载、验证、准备、解析、初始化(即类已就绪)
- 在堆中分配内存(指针碰撞或空闲列表,取决于 GC 策略)
- 将内存空间(除对象头外)初始化为零值(int→0,引用→null)
- 设置对象头:写入 Mark Word(含哈希码、锁状态、GC 年龄)和类型指针(指向方法区类元数据)
- 执行
() 方法:合并构造器、成员变量显式赋值、实例初始化块 - 把堆中对象地址赋给栈中引用变量,对象才可被程序访问
应用阶段(In Use)
对象处于强可达状态,可正常参与业务逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只要存在一条从 GC Roots(如栈帧局部变量、静态字段、本地方法栈引用等)出发的强引用链,对象就存活
- 可自由读写字段、调用方法、被放入集合、作为参数传递
- 局部变量超出作用域不等于对象死亡——只要还有其他强引用(比如被存进 static Map),仍属此阶段
不可达阶段(Unreachable)
对象失去所有强引用,成为垃圾回收的候选目标:
- 所有强引用均消失(例如引用设为 null、从集合移除、静态变量重赋值)
- 无法通过任何 GC Roots 追溯到该对象
- 此时对象尚未被清理,但已被标记为“待回收”
- 若重写了 finalize()(不推荐),会被放入 F-Queue,由 Finalizer 线程异步执行;仅当该方法内重新建立强引用,才可能“复活”一次
回收与释放阶段(Collection & Release)
GC 线程真正清理对象并归还内存:
- 执行实际内存回收(按所用算法:标记-清除、标记-整理或复制)
- 清除对象在堆中的数据,更新内存管理结构(如卡表、记忆集)
- 对象占用的空间被回收,后续可重新分配
- finalize() 执行不保证时机,也不应依赖它释放资源;推荐使用 try-with-resources 或 Cleaner 替代
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










