Java垃圾回收,将引用设置为null

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显然可以从

当到达第8行时,obj1符合GC条件。obj2也符合GC条件吗?

您为
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;