Java垃圾回收,将引用设置为null
当到达第8行时,obj1符合GC条件。obj2也符合GC条件吗?您为Java垃圾回收,将引用设置为null,java,garbage-collection,Java,Garbage Collection,当到达第8行时,obj1符合GC条件。obj2也符合GC条件吗?您为obj2创建的唯一引用位于obj1(b.a=new a();)中。一旦您丢失了对obj1(b=null;)的引用,您也丢失了对obj2的引用,因此是的,它符合GC的条件。如果您想确定对象是否符合垃圾收集的条件,请尝试查看它是否可以从根集访问。根集类似于从调用堆栈和全局变量引用的对象 在您的示例中,根集最初由ifobj1和args组成(让我们忽略可能存在的任何其他根集-它们对于您的示例并不重要)。就在第6行之前,obj2显然可以从
obj2
创建的唯一引用位于obj1
(b.a=new a();
)中。一旦您丢失了对obj1
(b=null;
)的引用,您也丢失了对obj2
的引用,因此是的,它符合GC的条件。如果您想确定对象是否符合垃圾收集的条件,请尝试查看它是否可以从根集访问。根集类似于从调用堆栈和全局变量引用的对象
在您的示例中,根集最初由if
obj1
和args
组成(让我们忽略可能存在的任何其他根集-它们对于您的示例并不重要)。就在第6行之前,obj2
显然可以从根集访问,因为obj1
包含对obj2
的引用。但是在第7行之后,根集中唯一的对象是args
。无论是obj1
还是obj2
都无法从args
引用,因此在第8行obj1
和obj2
都符合收集条件。是,下面是一个显示GC运行的示例:
public class A{
A a;
public static void main(String args[]){
A b = new A();//new object created, obj1
b.a = new A();//new object created, obj2
b = null;
//line 8
}
}
输出:
static int c = 2;
public static void main(String args[]) throws Exception {
class A{
A a;
}
A b = new A(){
public void finalize(){
System.out.println("obj 1 has been GC'd");
c--;
}
};
b.a = new A(){
public void finalize(){
System.out.println("obj 2 has been GC'd");
c--;
}
};
b = null;
while(c>0) {
System.gc();
Thread.sleep(42);
}
}
是没有用的,因为一行之后你已经到达了b的范围的末尾。这两个对象离开定义它们的作用域后都不可访问,因为它们的引用不是通过方法调用或构造函数调用中的参数放置在其他地方的,也不是作为其他地方发布的对象的反向引用放置在其他地方的
obj 1 has been GC'd
obj 2 has been GC'd
b = null;