java类=null的回收
在Java(或类似使用垃圾回收的语言)中,当你执行 a = null
后,对象 B()
是否会被回收取决于是否还有其他引用指向它。具体分析如下:
关键点:
-
引用链分析:
-
初始时:
a
引用了A
实例,A
的属性c
引用了B
实例。 -
执行
a = null
后:-
a
不再引用A
实例。 -
如果
A
实例没有被其他对象引用(即从根对象如静态变量、活动线程栈等不可达),则A
实例和它的属性c
(即B
实例)都会成为垃圾回收的候选对象。
-
-
-
是否回收
B()
:-
如果
B
实例仅通过A.c
被引用,且A
实例本身不可达,那么B
会被一并回收。 -
如果
B
实例还被其他对象引用(例如全局变量、其他对象的属性等),则它不会被回收。
-
class A {Object c;void createB() {this.c = new B(); // B实例被A.c引用}
}// 场景1:仅A引用B
A a = new A();
a.createB();
a = null; // A和B均可被回收(如果没有其他引用)// 场景2:B被其他对象引用
A a = new A();
a.createB();
Object otherRef = a.c; // 其他引用指向B
a = null; // A可被回收,但B不会被回收(因为otherRef仍引用它)
总结:
-
B()
会被回收的条件:A
实例和B
实例都不可达(即没有任何引用链能从根对象访问到它们)。 -
B()
不会被回收的条件:存在其他引用指向B
。
垃圾回收器通过可达性分析(Reachability Analysis)判断对象是否存活,与对象之间的赋值关系无关。