Python对象循环引用垃圾回收算法

来介绍一下 Python 是采用何种途径解决循环引用问题的。
在这里插入图片描述
上图中,表示的是对象之间的引用关系,从自对象指向他对象的引用用黑色箭头表示。每个对象里都有计数器。 而图中右侧部分可以很清晰的看到是循环引用的垃圾对象。

在这里插入图片描述
上图,将每个对象的引用计数器复制到自己的另一个存储空间中。

在这里插入图片描述

上图其实和图二没什么区别,只不过更清晰了。因为对象本来就是由对象链表连接的。只不过是把对象链表画了出来。

在这里插入图片描述

上图中,将新复制的计数器都进行了减量的操作。先不要管为什么,继续往下看。
但是可以看到,由根直接引用的对象中,新复制的计数器并没有减量。
以上操作执行完毕后,再把对象分为可能到达的对象链表和不可能到达的对象链表

之后将具备如下条件的对象连接到“可能到达对象的链表”。

  1. 经过 (4) 的减量操作后计数器值大于等于 1。
  2. 有从活动对象的引用。

再将具备如下条件的对象连接到“不可能到达对象的链表”。

  1. 经过 (4) 的减量操作后计数器值为 0
  2. 没有从活动对象的引用

在这里插入图片描述
现在上图显示的就是垃圾对象链表和活动对象的链表了。接下来的步骤就是释放不可能到达的对象,再把可能到达的对象连接到对象链表。

在这里插入图片描述

这样,Python中只要将“部分标记-清除算法”稍加变形,就解决了循环引用问题。

参考文章
http://t.zoukankan.com/Leon-The-Professional-p-10137405.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值