python gc模块

python gc模块

python gc模块

一. 介绍:

gc模块为可配置的垃圾回收器提供了一个接口。通过它我们可以禁用回收器、调整回收频率以及设置debug选项。除此之外,也为用户能够查看那些无法回收的对象(unreachable objects)打开了一扇大门。

二. 禁用/激活GC:

假入你确保自己的程序不会造成对象循环引用,你可以禁掉垃圾回收器。通过使用gc.disable(),可以禁掉自动垃圾回收器。 相关函数:

  1. gc.enable():激活GC
  2. gc.disable():禁用GC
  3. gc.isenabled():检查是否激活

三. 调试:

可以gc.set_debug(gc.DEBUG_LEAK)来调试有内存泄露的程序。除此之外,还有DEBUG_SAVEALL,该选项能够让被回收的对象保存在gc.garbage里面,以便检查。相关函数/属性:

  1. gc.set_debug(flags) 设置调试标记,因标记为位标记,所以flags可以是多个标记的组合。调试信息将会写到sys.stderr中。
  2. gc.get_debug() 返回当前设置的调试标记。
  3. gc.garbage

四. 回收操作和设置

  1. gc.collect([generation]) 触发回收行为,返回unreachable object的数量。generation可选参数, 用于指定回收第几代垃圾回收,取值0-1,由此也可看出python使用的是分代垃圾回收。关于分代垃圾回收可看java分代垃圾回收机制如果不提供参数,表示对整个堆进行回收,即Full GC。

  2. 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有二个作用,感觉有点怪,到时看看源码确认分析得对不对。)
  3. gc.get_threshold():返回一个3元组,即(threshold0,threshold1,threshod2)

五. 回收信息获取

  1. gc.get_count():Return the current collection counts as a tuple of (count0, count1, count2).
  2. gc.get_referents(*objs):返回对objs任一对象引用的所有对象列表。
  3. gc.get_referents(*objs):返回objs任一对象引用的对象列表。如果obj是个容器,则返回容器中的对象列表。