当一个对象的引用数量为0时,就可以被回收了。
public class MyObject {
public Object ref = null ;
public static void main(String[] args) {
MyObject myObject1 = new MyObject();
MyObject myObject2 = new MyObject();
myObject1.ref = myObject2;
myObject2.ref = myObject1;
myObject1 = null ;
myObject2 = null ;
}
}
从上面的代码可以轻易地发现myObject1与myObject2互为引用,我们知道如果采用引用计数法,myObject1和myObject2将不能被回收,因为他们的引用计数无法为零。
?????????
Object obj=null; 只在栈中创建一个变量 无指向的对象 在堆中不分配内存
Object obj=new Object();栈中创建一个变量 在堆中给他创建了一个对象(分配内存) 变量指向这个对象
但是这里的ref在什么位置???
但是具体是为什么呢?已上图为例,当代码执行完line7时,两个对象的引用计数均为2。此时将myObject1和myObject2分别置为null,以前一个对象为例,它的引用计数将减1。若要满足垃圾回收的条件,需要清除myObject2中的ref这个引用,而要清除掉这个引用的前提条件是myObject2引用的对象被回收,可是该对象的引用计数也为1,因为myObject1.ref指向了它。以此类推,也就进入一种死循环的状态。
类似于形成了死锁。