python中的GC模块
python中的垃圾回收是以引用计数为主,分代收集为辅
导致引用计数+1的情况
1、对象被创建
2、对象被引用
3、对象被作为参数,传入到一个函数中
4、对象作为一个元素,存储在容器中
导致引用计数-1的情况
1、对象的别名被显式销毁
2、对象的别名被赋予新的对象
3、一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4、对象所在的容器被销毁,或从容器中删除对象。
查看一个对象的引用计数
可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1
内存泄漏
申请了某些内存,但是忘记了释放,那么这就造成了内存的浪费,久而久之内存就不够用了
演示
执行f2,进程占用的内存会不断增大。
创建了c1,c2后,这两块内存的引用计数都是1,执行c1.t=c2和c2.t=c1后,这两块内存的引用计数变成2.在del c1后,引用计数变为1,由于不是0,所以c1对象不会被销毁;同理,c2对象的引用数也是1.
python默认是开启垃圾回收功能的,但是由于以上程序已经将其关闭,因此导致垃圾回收器都不会回收它们,所以就会导致内存泄露。手动调用gc回收垃圾
有三种情况会触发垃圾回收:
1、当gc模块的计数器达到阈值的时候,自动回收垃圾。
2、调用gc.collect(),手动回收垃圾
3、程序退出的时候,python解释器来回收垃圾gc模块的自动垃圾回收触发机制