python中的GC模块

python中的垃圾回收是以引用计数为主,分代收集为辅

导致引用计数+1的情况
1、对象被创建
2、对象被引用
3、对象被作为参数,传入到一个函数中
4、对象作为一个元素,存储在容器中

导致引用计数-1的情况
1、对象的别名被显式销毁
2、对象的别名被赋予新的对象
3、一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4、对象所在的容器被销毁,或从容器中删除对象。

查看一个对象的引用计数

python计算两序列相系数 python计算序列gc含量_python


可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1

内存泄漏
申请了某些内存,但是忘记了释放,那么这就造成了内存的浪费,久而久之内存就不够用了

演示

python计算两序列相系数 python计算序列gc含量_python_02


执行f2,进程占用的内存会不断增大。

创建了c1,c2后,这两块内存的引用计数都是1,执行c1.t=c2和c2.t=c1后,这两块内存的引用计数变成2.在del c1后,引用计数变为1,由于不是0,所以c1对象不会被销毁;同理,c2对象的引用数也是1.

python默认是开启垃圾回收功能的,但是由于以上程序已经将其关闭,因此导致垃圾回收器都不会回收它们,所以就会导致内存泄露。手动调用gc回收垃圾

python计算两序列相系数 python计算序列gc含量_引用计数_03


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

1、当gc模块的计数器达到阈值的时候,自动回收垃圾。

2、调用gc.collect(),手动回收垃圾

3、程序退出的时候,python解释器来回收垃圾gc模块的自动垃圾回收触发机制

python计算两序列相系数 python计算序列gc含量_引用计数_04


python计算两序列相系数 python计算序列gc含量_python计算两序列相系数_05


python计算两序列相系数 python计算序列gc含量_python计算两序列相系数_06


python计算两序列相系数 python计算序列gc含量_python_07


python计算两序列相系数 python计算序列gc含量_python_08