对象实例及其成员变量的生命周期由可达性决定:从new创建开始,到gc判定不可达并回收为止;非static成员变量随对象一同分配和销毁,其引用指向的对象有独立生命周期,取决于全局强引用路径是否存在。

堆内存中分配的对象实例及其成员变量的生命周期,由对象是否可达决定,而非作用域或方法调用结束。只要对象仍被至少一个活动引用链所指向,它就存活;一旦所有引用消失,它成为垃圾回收候选对象。
对象实例的生命周期从 new 开始,到 GC 回收为止
使用 new 关键字(或反射、反序列化等)在堆上创建对象时,实例诞生。它的生命周期持续到垃圾收集器判定其“不可达”并回收其所占内存为止。
- 方法内创建的对象,若未逃逸出方法(如未被返回、未存入静态字段或外部容器),通常在方法返回后很快不可达
- 若对象被赋值给静态字段、放入集合、作为参数传给长期运行的线程或回调,它的生命周期可能远超创建它的方法
- 即使局部变量已离开作用域,只要对象仍被其他活跃引用持有着,就不会被回收
成员变量的生命周期依附于所属对象
成员变量(非 static)不是独立分配的,它们是对象实例的一部分,随对象一起在堆上分配。因此,它们的生命周期与所在对象完全一致。
- 对象创建时,所有成员变量(包括引用类型和基本类型)一并初始化并占用空间
- 对象被回收时,所有成员变量也随之消失——不需要单独“释放”成员变量
- static 成员变量例外:它属于类,存在方法区(或元空间),生命周期与类加载/卸载绑定,不随对象消亡
引用类型成员变量指向的对象,有独立生命周期
如果一个成员变量是引用类型(如 List
- 父对象被回收 → 其引用类型的成员变量字段消失 → 若该字段是这些被指向对象的唯一强引用,则那些对象也同时变为不可达
- 但如果 List 还被其他变量引用(如被添加进全局缓存),那么即使父对象没了,List 依然存活
- 所以真正决定子对象生死的,是整个引用图中是否存在强可达路径,而非谁持有它
显式置 null 有时有用,但多数情况不必要
在长生命周期对象中持有短生命周期数据(如缓存、临时缓冲区)时,及时将不再需要的引用成员设为 null,可帮助 GC 更早识别回收时机。
- 典型场景:大数组、IO 缓冲区、解析中间结果等,避免意外延长内存驻留时间
- 普通业务对象中对局部逻辑无影响的字段,无需刻意置 null —— JVM 的逃逸分析和现代 GC 已足够智能
- 更推荐的做法是控制引用范围,比如用局部变量代替 long-lived 字段来持有临时对象










