垃圾回收-引用计数法循环引用问题

本文探讨了垃圾回收中引用计数法的实现原理及优缺点,尤其关注其在对象循环引用场景下的局限性,通过具体代码示例解析了循环引用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  实现思路:给对象添加一个引用计数器。每当有一个地方引用它时,计数器加1;引用失效时计数器减1。在任何时刻计数器为0的对象就是不可能再被使用的。

  优点:实现简单,效率高。

  缺点:很难解决对象之间的相互循环引用。A引用B,B引用A ——循环引用 (引用计数算法)由于A、B彼此引用对方,导致引用计数都不为0,所以GC无法回收它们

 1 public class MyObject {
 2     public Object ref = null;
 3     public static void main(String[] args) {
 4         MyObject myObject1 = new MyObject();
 5         MyObject myObject2 = new MyObject();
 6         myObject1 = myObject2;
 7         myObject2 = myObject1;
 8         myObject1 = null;
 9         myObject2 = null;
10     }
11 }

以myObject1对象为例:

  1、代码执行到line6,myObject1的引用计数为2。

  2、myObject1 = null,myObject1的引用计数为1。

  3、myObject1=0,垃圾回收器才能进行垃圾回收,myObject1 = myObject2;因为myObject1持有myObject2的引用,而要清除掉这个引用的前提条件是myObject2引用的对象被回收。而myObject2 = myObject1,最终死循环。

  4、myObject1 和myObject2均为1,导致不能进行垃圾回收。

引用计数法的循环引用问题

转载于:https://www.cnblogs.com/gogogofh/p/11113744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值