python gc模块
python gc模块
一. 介绍:
gc模块为可配置的垃圾回收器提供了一个接口。通过它我们可以禁用回收器、调整回收频率以及设置debug选项。除此之外,也为用户能够查看那些无法回收的对象(unreachable objects)打开了一扇大门。
二. 禁用/激活GC:
假入你确保自己的程序不会造成对象循环引用,你可以禁掉垃圾回收器。通过使用gc.disable(),可以禁掉自动垃圾回收器。 相关函数:
- gc.enable():激活GC
- gc.disable():禁用GC
- gc.isenabled():检查是否激活
三. 调试:
可以gc.set_debug(gc.DEBUG_LEAK)来调试有内存泄露的程序。除此之外,还有DEBUG_SAVEALL,该选项能够让被回收的对象保存在gc.garbage里面,以便检查。相关函数/属性:
- gc.set_debug(flags) 设置调试标记,因标记为位标记,所以flags可以是多个标记的组合。调试信息将会写到sys.stderr中。
- gc.get_debug() 返回当前设置的调试标记。
- gc.garbage
四. 回收操作和设置
gc.collect([generation]) 触发回收行为,返回unreachable object的数量。generation可选参数, 用于指定回收第几代垃圾回收,取值0-1,由此也可看出python使用的是分代垃圾回收。关于分代垃圾回收可看java分代垃圾回收机制如果不提供参数,表示对整个堆进行回收,即Full GC。
gc.set_threshold(threshold0[,threshold1[,threshold2) 设置不同代回收线程的回收频率,GC会把生命周期不同的对象分别放到3种代去管理回收,generation 0即使传说中的young genration年轻代,generation 1为老年代,gerneration为老老年代(能叫持久代么?)
- 何时启动回收:通过比较上次回收之后,比较分配的资源数allocations和释放的资源数delallocation来决定是否启动回收,比如,当分配的资源减去释放的资源数超过threshold0时,回收generation 0代对象
- 何时检查callocation和dellocation:一开始只有generatin 0被检查,当generation 0被检查的次数是generation 1检查次数是thresholds1倍时,generation 1开始检查。generation2的检查也是这个道理,不赘述。 (照我这么分析,throshold0/1/2有二个作用,感觉有点怪,到时看看源码确认分析得对不对。)
gc.get_threshold():返回一个3元组,即(threshold0,threshold1,threshod2)
五. 回收信息获取
- gc.get_count():Return the current collection counts as a tuple of (count0, count1, count2).
- gc.get_referents(*objs):返回对objs任一对象引用的所有对象列表。
- gc.get_referents(*objs):返回objs任一对象引用的对象列表。如果obj是个容器,则返回容器中的对象列表。