Python gc
Python gc
Python gc 模块提供垃圾回收器的接口
关于 Python 垃圾回收 <- 点击查看
官方文档:https://docs.python.org/3/library/gc.html?highlight=gc
enable & disable
enable() -- 开启自动垃圾回收
disable() -- 关闭自动垃圾回收
isenabled() -- 查看是否开启自动垃圾回收
collect
collect() -- 立刻进行全部垃圾回收
可以传入 int 指定对前几代链表进行垃圾回收 (只能为 0、1、2,否则会报错)
返回 unreachable 对象数量
get_count
get_count() -- 返回垃圾回收计数器,表示每层链表计数分别是多少
get_stats
get_stats() -- 返回一个包含每代链表状态的字典
debug
set_debug() -- 设置垃圾回收器的调试标识位,调试信息会被写入 sys.stderr
get_debug() -- 获取垃圾回收器的调试标识位
传入的整数会被转换成二进制,对应的位开启对应的调试:
1: DEBUG_STATS - 在回收完成后打印统计信息。当回收频率设置较高时,这些信息会比较有用
2: DEBUG_COLLECTABLE - 当发现可回收对象时打印信息
4: DEBUG_UNCOLLECTABLE - 打印找到的不可回收对象的信息(指不能被回收器回收的不可达对象)。这些对象会被添加到 garbage 列表中
8: DEBUG_SAVEALL - 设置后,所有回收器找到的不可达对象会被添加进 garbage 而不是直接被释放。这在调试一个内存泄漏的程序时会很有用
16: DEBUG_LEAK - 调试内存泄漏的程序时,使回收器打印信息的调试标识位 (等价于除了 DEBUG_STATS 外的其他 3 个)
threshold
set_threshold(threshold0[, threshold1[, threshold2]]) -- 设置自动执行垃圾回收的阈值
get_threshold() -- 获取自动执行垃圾回收的阈值
当回收阈值为 0 时,会禁用回收
当分配对象的数量减去释放对象的数量大于阈值 threshold0 时,对第零代启动垃圾回收
当上一次第一代回收之后,第零代的回收次数大于阈值 threshold1 时,对第一代进行垃圾回收
当上一次第二代回收之后,第一代的回收次数大于阈值 threshold2 时,对第二代进行垃圾回收
track
get_objects(generation=None) -- 返回一个被收集器追踪的对象列表
is_tracked() -- 该对象是否被追踪,一般原子类的实例不会被追踪,而非原子类(如容器、用户自定义的对象)会被追踪
示例:
import gc
print(gc.is_tracked(0))
print(gc.is_tracked('a'))
print(gc.is_tracked(list()))
print(gc.is_tracked(dict()))
print(gc.is_tracked({'a': 1}))
print(gc.is_tracked({'a': []}))
输出结果:
False
False
True
False
False
True
refer
get_referrers() -- 返回一个包含直接引用该对象的对象的列表,只有支持垃圾回收的容器 (已经解除占用,但在循环引用中并未被回收的对象仍然会出现,可以先 collect())
get_referents() -- 返回一个包含该对象引用对象的列表
freeze
freeze() -- 冻结所有追踪的对象,移至永久代并忽略以后的回收
unfreeze() -- 解冻所有对象,并将它们放到年老代中
get_freeze_count() -- 返回永久代中对象数量