垃圾回收-引用计数

本文介绍了垃圾回收中的引用计数方法,包括其工作原理和存在的问题,如无法处理循环引用。在示例代码中展示了A和B类之间的循环引用导致的对象无法释放问题。为解决这一问题,提出了两种可能的解决方案:全局遍历回收和使用强弱指针。文章深入浅出地解析了内存管理的关键概念。
摘要由CSDN通过智能技术生成

垃圾回收共有3种

1.一种是引用计数

引用计数就是每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。

引用计数的缺点是:

(1)不能解决循环引用

(2)会有并发的问题

但是不能解决循环引用问题,循环引用如右边橙色的图:

不能解决循环引用的原因是:

class TestA{ public TestB b; }
class TestB{ public TestA a; }
public class Main{
    public static void main(String[] args)
    { 
        A a = new A();//对象A的引用计数为1
        B b = new B(); //对象B的引用计数为1
        a.b=b; //对象B的引用计数为2
        b.a=a; //对象A的引用计数为2
        a = null; //对象A的引用计数为1
        b = null; //对象B的引用计数为1
    }
} 

如上面这段代码,在a=null过程中,由于a的引用原本是2,不能回收a,该过程只是将a的引用变成1,没有对a.b进行收回,此时并没有递减b的引用; 经过b=null,b引用变成1。此时变成a引用数1,b引用数1。导致内存无法释放。

处理的方法:

(1).起一个线程全局循环遍历,找到没有被回收的就回收

(2).强弱指针,没看懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值