gc
gc - 垃圾收集器接口
该模块为可选的垃圾收集器提供了一个接口。 它提供了禁用收集器,调整收集频率并设置调试选项的功能。 它还提供对收集器找到但不能释放的不可访问对象的访问。 由于收集器补充了Python中已经使用的引用计数,所以如果您确定程序没有创建引用循环,则可以禁用收集器。 通过调用gc.disable()可以禁用自动收集。 调试泄漏的程序调用gc.set_debug(gc.DEBUG_LEAK)。 请注意,这包括gc.DEBUG_SAVEALL,导致垃圾回收对象被保存在gc.garbage中以供检查。
该gc
模块提供以下功能:
gc.enable()
启用自动垃圾收集。
gc.disable()
禁用自动垃圾收集。
gc.isenabled()
如果启用自动收集,则返回true。
gc.collect([generation])
没有参数,运行一个完整的集合。 可选参数的生成可以是一个整数,指定要收集哪一代(从0到2)。 如果世代号无效,则会引发ValueError。 返回找到的不可到达对象的数量。
在版本2.5中更改:添加了可选的生成
参数。
在版本2.6中进行了更改:只要运行最高一代(2)的完整集合或集合,就会清除为许多内置类型维护的空闲列表。不要在一些免费的列出了所有项目可能被释放,由于特定的实现,特别是int
和float
。
gc.set_debug(flags)
设置垃圾收集调试标志。调试信息将被写入sys.stderr
。请参阅下面的调试标志列表,这些标志可以使用位操作进行组合来控制调试。
gc.get_debug()
返回当前设置的调试标志。
gc.get_objects()
返回收集器跟踪的所有对象的列表,不包括返回的列表。
2.2版本中的新功能。
gc.set_threshold(threshold0[, threshold1[, threshold2]])
设置垃圾收集阈值(收集频率)。将threshold0
设置为零将禁用收集。
GC将物体分成三代,具体取决于它们存活了多少次收集扫描。 新对象放置在最年轻的一代(0代)。 如果一个物体在一个集合中存活,它就会被移入下一代老一代。 由于第二代是最古老的一代,所以这一代的物品在收藏后仍然存在。 为了决定何时运行,收集器会跟踪自上次收集以来的数字对象分配和释放。 当分配数量减去释放次数超过阈值0时,开始收集。 最初只检查第0代。 如果第1代已经被检查超过阈值1次,那么第1代也被检查。 同样,在收集第2代之前,threshold2控制第1代的收集数量。
gc.get_count()
将当前集合计数作为一个(count0, count1, count2)
元组返回。
2.5版本中的新功能。
gc.get_threshold()
将当前收集阈值作为一个(threshold0, threshold1, threshold2)
元组返回。
gc.get_referrers(*objs)
返回直接引用任何objs的对象列表。这个函数只会定位那些支持垃圾收集的容器; 不会发现引用其他对象但不支持垃圾回收的扩展类型。
请注意,已经被解除引用的对象,但是生活在周期中并且尚未被垃圾收集器收集的对象可以列在所产生的引用者中。要仅获取当前活动对象,请collect()
在调用之前调用get_referrers()
。
使用返回的物品时必须小心,get_referrers()
因为其中一些物品可能仍在施工中,因此处于暂时无效的状态。get_referrers()
除了调试以外,请避免使用其他用途。
2.2版本中的新功能。
gc.get_referents(*objs)
返回任何参数直接引用的对象列表。返回的对象是由参数的C级tp_traverse
方法(如果有的话)访问的那些对象,并且可能不是实际可以直接访问的所有对象。tp_traverse
方法仅由支持垃圾收集的对象支持,并且只需要访问可能涉及周期的对象。因此,例如,如果一个整数可以直接从参数中访问,那么整数对象可能会或可能不会出现在结果列表中。
2.3版本的新功能。
gc.is_tracked(obj)
如果对象当前由垃圾收集器跟踪,则返回True,否则返回False。 作为一般规则,不跟踪原子类型的实例,并且非原子类型(容器,用户定义的对象...)的实例。 但是,为了抑制简单实例的垃圾回收器占用空间(例如仅包含原子键和值的字符串),可以存在一些类型特定的优化:
>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked{})
False
>>> gc.is_tracked{"a": 1})
False
>>> gc.is_tracked{"a": []})
True
2.7版本的新功能。
以下变量用于只读访问(您可以改变它的值但不应该重新绑定它):
gc.garbage
收集器发现无法释放但无法释放的对象列表(不可收集的对象)。默认情况下,此列表仅包含带__del __()方法的对象。 [1]具有__del __()方法并且是引用循环的一部分的对象会导致整个引用循环无法收集,包括不一定在循环中但只能从循环中访问的对象。 Python不会自动收集这些循环,因为一般来说,Python不可能猜测运行__del __()方法的安全顺序。如果您知道安全订单,则可以通过检查垃圾列表来强制解决问题,并明确打破由于列表中的对象而导致的周期。请注意,这些对象由于处于垃圾列表中而保持活动状态,因此它们也应该从垃圾中移除。例如,打破循环之后,请执行del gc.garbage [:]以清空列表。最好避免使用__del __()方法创建包含对象的循环,并在此情况下检查垃圾以确认没有创建这样的循环。
如果设置DEBUG_SAVEALL
,则所有不可访问的对象将被添加到此列表中而不是释放。
提供以下常量用于set_debug()
:
gc.DEBUG_STATS
在收集期间打印统计。调整收集频率时,此信息可能很有用。
gc.DEBUG_COLLECTABLE
打印找到可收集对象的信息。
gc.DEBUG_UNCOLLECTABLE
打印找到的不可收集对象的信息(不可获取但不能被收集器释放的对象)。这些对象将被添加到garbage
列表中。
gc.DEBUG_INSTANCES
当DEBUG_COLLECTABLE
或者DEBUG_UNCOLLECTABLE
被设置时,打印关于找到的实例对象的信息。
gc.DEBUG_OBJECTS
当DEBUG_COLLECTABLE
或者DEBUG_UNCOLLECTABLE
被设置时,打印关于找到的实例对象以外的对象的信息。
gc.DEBUG_SAVEALL
设置时,找到的所有不可访问的对象将被追加到垃圾中,
而不是被释放。这对调试泄漏程序很有用。
gc.DEBUG_LEAK
收集器需要打印有关泄漏程序(等于DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES | DEBUG_OBJECTS | DEBUG_SAVEALL
)的信息的调试标志。
脚注
1 | 在Python 2.2之前,该列表包含不可达循环中的所有实例对象,不仅包含带__del __()方法的实例对象。 |
---|