c++对象回收问题_GC垃圾回收的原理和涉及的几种算法

1‍ GC垃圾回收的原理‍

其实垃圾回收的原理很简单:就是判断出死亡的对象,然后清除死亡的,留下存活的即可。那么怎么判断对象已经死亡呢?常有的有以下两种:

1)引用计数法(Reference Counting):在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;当引用计数为0时就会被回收。但是它存在一个很大的问题就是循环引用:如下图,当实例化A时,A会持有实例B,B会持有C,C持有A。这样一来我们就会发现:如果需要回收A,除了释放初始实例化引用,还需要释放C的引用。但是由于ABC互相引用,所以就造成谁也无法释放。主流的垃圾回收都没有采用这种判断方法,因为需要额外的工作来解决它(感兴趣的童鞋可以看看智能指针)。

2ad9c2c63066ccb0a0b5a0e94625c62c.png

2)可达性分析算法(Reachability Analysis):在JAVA虚拟机中就是通过可达性分析法来判定对象是否存活的。思路是通过“GC Roots”的对象(可以认为是确定固定存在的对象)作为起始点,然后从这些节点开始遍历所有引用链,如果某个对象没有GC Roots直接或间接的连接的话,这个对象(白色节点)就被认为程序中不再使用可以被回收了。如下图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值