垃圾回收分类中:引用计数法中的循坏引用问题

当一个对象的引用数量为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指向了它。以此类推,也就进入一种死循环的状态。

类似于形成了死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值