随着你的程序运⾏,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__⽅法