python 垃圾回收机制

垃圾回收机制

引用计数

每次对象被引用时,会被计数加1,当计数为0时,则回收该对象。

注意: 循环引用的情况,引用计数不能解决.

在这里插入图片描述

标记-清除

对所有活跃的对象进行标记,对非活跃对象进行回收。可以有效的解决循环引用的问题

原理
对象之间通过引用构建有向图,从root object(全局变量,寄存器等不可删除的对象)出发,沿着有向边遍历对象,可达的对象标记为活跃对象,不可达的对象就是要被清除的非活动对象。

在下图中,从黑点开始出发,1对象可达,2、3间接可达,1、2、3是活跃对象,4,5不可达,所以是非活跃对象,进行回收。
在这里插入图片描述

过程
找到root object集合, 在内存建立两条连表,一条链表维护root object集合,另一条链表哦维护剩下的对象,在标记的过程中,如果在不可达链表中存在被root链表中的独享,直接或间接引用独享,就将其从不可达链表移到root链表中。当完成标记后,不可达链表剩下的对象都是垃圾对象,进行回收。

分代回收

对象分在不同集合中,每个集合称为一个, Python中分为3代,年轻代(第0代)、中年代(第1代)、老年代(第二代),对应3各链表,每一代GC频率不同,第0代最高,第1代次之,第二代最低(越年轻的对象越容易死掉,而老的对象通常会存错更久),新生的对象放入第0代,如果该对象在第0代的一次GC中存活,则移动到第1代,如果第一代对象在第1代GC中存错,则移动到第2代。

什么情况触发GC, 可以设置阈值,也可以手动调用gc.collect()

每次扫描全部对象,费时费力,提高GC的效率。

欢迎关注,互相学习,共同进步~

我的个人博客

我的微信公众号:编程黑洞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值