Skip to main content

29.11. 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=2)

没有参数,运行一个完整的集合。可选参数 generation 可以是指定要收集哪个生成(从0到2)的整数。如果代数无效,则会出现 ValueError。将返回找到的不可达对象的数量。

每当运行最高代(2)的完整集合或集合时,将清除为多个内置类型维护的空闲列表。由于特定的实现,特别是 float,某些自由列表中的所有项目可能不被释放。

gc.set_debug(flags)

设置垃圾收集调试标志。调试信息将写入 sys.stderr。请参见下面的调试标志列表,可以使用位操作来组合使用控制调试。

gc.get_debug()

返回当前设置的调试标志。

gc.get_objects()

返回收集器跟踪的所有对象的列表,不包括返回的列表。

gc.get_stats()

从解释器启动后,返回包含集合统计信息的三个每代字典的列表。键的数量可能会在将来更改,但目前每个字典将包含以下项目:

  • collections 是该代收集的次数;

  • collected 是在这一代内收集的对象的总数;

  • uncollectable 是在这一代内发现无法收集(并因此移动到 garbage 列表)的对象的总数。

3.4 新版功能.

gc.set_threshold(threshold0[, threshold1[, threshold2]])

设置垃圾收集阈值(收集频率)。将 threshold0 设置为零将禁用收集。

GC根据它们存活的收集扫描数量将对象分为三代。新对象放置在最小的一代(生成 0)。如果一个对象在一个集合中存活,它会被移动到下一个老一代。因为生成 2 是最旧的一代,所以该生成中的对象在收集之后保持在那里。为了决定何时运行,收集器跟踪自上次收集以来的数字对象分配和释放。当分配数量减去解除分配数量超过 threshold0 时,收集开始。最初仅检查代 0。如果生成 0 已经被检查多于 threshold1 次,因为已经检查了生成 1,则也检查生成 1。类似地,threshold2 在收集生成 2 之前控制生成 1 的集合的数量。

gc.get_count()

将当前收集计数返回为 (count0, count1, count2) 的元组。

gc.get_threshold()

将当前收集阈值作为 (threshold0, threshold1, threshold2) 的元组返回。

gc.get_referrers(*objs)

返回直接引用任何obj的对象列表。这个函数只会定位那些支持垃圾收集的容器;将不会找到引用其他对象但不支持垃圾回收的扩展类型。

注意,可以在结果引用中列出已经被取消引用,但是循环生存并且尚未被垃圾收集器收集的对象。要仅获取当前活动对象,请在调用 get_referrers() 之前调用 collect()

当使用 get_referrers() 返回的对象时必须小心,因为它们中的一些仍然在构建中,因此处于临时无效状态。避免将 get_referrers() 用于除调试之外的任何目的。

gc.get_referents(*objs)

返回由任何参数直接引用的对象列表。返回的对象是参数’C级 tp_traverse 方法访问的那些对象(如果有的话),并且可能不是所有实际上可直接到达的对象。 tp_traverse 方法仅由支持垃圾回收的对象支持,并且仅需要访问可能涉及循环的对象。因此,例如,如果一个整数可以从一个参数直接到达,则该整数对象可以或可以不出现在结果列表中。

gc.is_tracked(obj)

如果对象当前由垃圾回收器跟踪,则返回 True,否则返回 False。作为一般规则,原子类型的实例不被跟踪,并且非原子类型(容器,用户定义的对象...)的实例是。然而,可以存在一些类型特定的优化以便抑制简单实例的垃圾收集器占用(例如,仅包含原子键和值的dicts):

>>> 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

3.1 新版功能.

为只读访问提供以下变量(您可以改变值,但不应重新绑定它们):

gc.garbage

收集器发现无法访问但无法释放的对象列表(无法收集的对象)。从Python 3.4开始,这个列表在大多数时候应该是空的,除非使用具有非空 tp_del 插槽的C扩展类型的实例。

如果设置了 DEBUG_SAVEALL,则所有不可达对象将被添加到此列表,而不是释放。

在 3.2 版更改: 如果此列表在 interpreter shutdown 处为非空,则会发出 ResourceWarning,默认情况下为静默。如果设置了 DEBUG_UNCOLLECTABLE,则还会打印所有无法收集的对象。

在 3.4 版更改: PEP 442 之后,具有 __del__() 方法的对象不再在 gc.garbage 中结束。

gc.callbacks

将在收集之前和之后由垃圾收集器调用的回调列表。将使用两个参数(phaseinfo)调用回调。

phase 可以是以下两个值之一:

“start”:垃圾收集即将开始。

“stop”:垃圾收集完成。

info 是为回调提供更多信息的dict。当前定义了以下键:

“generation”:最古老的一代被收集。

“collected”:当 phase 为“stop”时,成功收集的对象数。

“无法收集”:当 phase 是“停止”时,无法收集并放入 garbage 的对象数。

应用程序可以将自己的回调添加到此列表。主要用例是:

收集有关垃圾收集的统计信息,例如收集各种代的频率,以及收集的时间。

允许应用程序在 garbage 中显示时识别并清除自己的无法收集的类型。

3.3 新版功能.

提供以下常量用于 set_debug()

gc.DEBUG_STATS

在收集期间打印统计信息。此信息在调整收集频率时很有用。

gc.DEBUG_COLLECTABLE

打印有关可找到的可收集对象的信息。

gc.DEBUG_UNCOLLECTABLE

打印找到的不可收集对象的信息(收集器不能访问但不能释放的对象)。这些对象将添加到 garbage 列表中。

在 3.2 版更改: 还打印 interpreter shutdowngarbage 列表的内容,如果它不是空的。

gc.DEBUG_SAVEALL

设置时,找到的所有不可达对象将附加到 garbage,而不是被释放。这对于调试泄漏程序很有用。

gc.DEBUG_LEAK

收集器打印泄漏程序信息(等于 DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL)所需的调试标志。