python学习之垃圾回收四

随着你的程序运⾏,Python解释器保持对新创建的对象,以及因为引⽤计数为零⽽被释放掉的对象的追踪。

被分配对象的计数值与被释放对象的计数值之间的差异在逐渐增⻓。⼀旦这个差异累计超过某个阈值,则Python的收集机制就启动了,并且触动上边所说的零代算法,释放"浮动的垃圾",并且将剩下的对象移动到一代列表.

弱代假说:代垃圾回收算法的核⼼⾏为:垃圾回收器会更频繁的处理新对象。⼀个新的对象即是你的程序刚刚创建的,⽽⼀个来的对象则是经过了⼏个时间周期之后仍然存在的对象。Python会在当⼀个对象从零代移动到⼀代,或是从⼀代移动到⼆代的过程中提升(promote)这个对象。为什么要这么做?这种算法的根源来⾃于弱代假说(weak generationalhypothesis)。这个假说由两个观点构成:⾸先是年轻的对象通常死得也快,⽽⽼对象则很有可能存活更⻓的时间。

通过频繁的处理零代链表中的新对象,Python的垃圾收集器将把时间花在更有意义的地⽅:它处理那些很快就可能变成垃圾的新对象。同时只在很少的时候,当满⾜阈值的条件,收集器才回去处理那些⽼变量。(这里的含义是 新对象成为垃圾对象的概率比较大,所以零代列表中有更多的垃圾需要清理,所以零代列表更加需要进行频繁的处理).

垃圾回收-gc模块:

1.导致引入计数+1的情况:


2.导致引用计数-1的情况:


3查看⼀个对象的引⽤计数:

可以查看a对象的引⽤计数,但是⽐正常计数⼤1,因为调⽤函数的时候传⼊a,这会让a的引⽤计数+1

有三种情况会触发垃圾回收:

1. 调⽤gc.collect(),
2. 当gc模块的计数器达到阀值的时候。

3. 程序退出的时候

gc模块常用功能解析:

1、gc.set_debug(flags) 设置gc的debug⽇志,⼀般设置为gc.DEBUG_LEAK

2、gc.collect([generation]) 显式进⾏垃圾回收,可以输⼊参数,0代表只检查第⼀代的对象,1代表检查⼀,⼆代的对象,2 表检查⼀,⼆,三代的对象,如果不传参数,执⾏⼀个full collection,也就是等于传2。 返回不可达(unreachable objects)对象的数⽬.

3、gc.get_threshold() 获取的gc模块中⾃动执⾏垃圾回收的频率。

4、gc.set_threshold(threshold0[, threshold1[, threshold2]) 设置⾃动执⾏垃圾回收的频率。

5、gc.get_count() 获取当前⾃动执⾏垃圾回收的计数器,返回⼀个⻓度为3的列表

gc模块的⾃动垃圾回收机制

必须要import gc模块,并且 is_enable()=True 才会启动⾃动垃圾回收。

这个机制的 主要作⽤就是发现并处理不可达的垃圾对象 。

注意点:

gc模块唯⼀处理不了的是循环引⽤的类都有__del__⽅法,所以项⽬中要避免定义__del__⽅法





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值