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)

如果没有参数,请运行完整的集合。可选参数 一代 可以是一个整数,指定要收集的生成(从0到2)。一 ValueError 如果生成号无效,则引发。返回无法访问的对象数。

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

gc.set_debug(flags)

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

gc.get_debug()

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

gc.get_objects(generation=None)

返回收集器跟踪的所有对象的列表,不包括返回的列表。如果 一代 不是“无”,只返回由该代中的收集器跟踪的对象。

在 3.8 版更改: 新的 一代 参数。

gc.get_stats()

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

  • collections 是收集这一代的次数;

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

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

3.4 新版功能.

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

设置垃圾收集阈值(收集频率)。设置 阈值0 归零将禁用集合。

GC将对象分为三代,这取决于它们存活了多少次收集扫描。新对象被放置在最年轻的一代 0 )如果一个对象在集合中存活下来,它将被移动到下一代中。自一代以来 2 是最早的一代,该代中的对象在集合后仍保留在该代中。为了决定何时运行,收集器会跟踪自上次收集以来对象分配和释放的数量。当分配数减去释放数超过 阈值0 ,集合开始。最初只有一代 0 检查。中频发电 0 已经检查了超过 阈值1 世代以来的时代 1 已经检查过了,然后生成 1 也被检查过。对于第三代,事情有点复杂,明白吗 Collecting the oldest generation 更多信息。

gc.get_count()

以元组形式返回当前集合计数 (count0, count1, count2) .

gc.get_threshold()

以元组形式返回当前集合阈值 (threshold0, threshold1, threshold2) .

gc.get_referrers(*objs)

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

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

使用返回的对象时必须小心 get_referrers() 因为其中一些可能仍在建设中,因此处于暂时无效状态。避免使用 get_referrers() 用于调试以外的任何目的。

gc.get_referents(*objs)

返回由任何参数直接引用的对象列表。返回的引用是参数“c-level”访问的对象 tp_traverse 方法(如果有),并且可能不是所有对象都可以直接访问。 tp_traverse 方法仅受支持垃圾收集的对象支持,并且只需要访问可能涉及循环的对象。因此,例如,如果一个整数可以从一个参数直接访问,那么这个整数对象可能会出现在结果列表中,也可能不会出现在结果列表中。

gc.is_tracked(obj)

返回 True 如果对象当前由垃圾收集器跟踪, False 否则。一般来说,原子类型的实例不会被跟踪,非原子类型(容器、用户定义的对象…)的实例也会被跟踪。但是,为了抑制简单实例(例如,仅包含原子键和值的dict)的垃圾收集器占用空间,可以进行一些特定于类型的优化:

>>> 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.is_finalized(obj)

返回 True 如果给定的对象已由垃圾收集器完成, False 否则。:

>>> x = None
>>> class Lazarus:
...     def __del__(self):
...         global x
...         x = self
...
>>> lazarus = Lazarus()
>>> gc.is_finalized(lazarus)
False
>>> del lazarus
>>> gc.is_finalized(x)
True

3.9 新版功能.

gc.freeze()

冻结GC跟踪的所有对象-将它们移动到永久代,并忽略所有未来的集合。这可以在posix fork()调用之前使用,以使GC写时复制更友好,或者加快收集速度。另外,在posix fork()调用之前的集合可能会释放页供将来分配,这也会导致写时复制,因此建议在父进程中禁用GC,在fork之前冻结,并在子进程中启用GC。

3.7 新版功能.

gc.unfreeze()

将永久一代中的对象解冻,并将其放回最老一代。

3.7 新版功能.

gc.get_freeze_count()

返回永久生成中的对象数。

3.7 新版功能.

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

gc.garbage

收集器发现无法访问但无法释放的对象列表(无法收集的对象)。从Python3.4开始,这个列表大部分时间都应该是空的,除非使用非空的C扩展类型实例`` tp_del 狭槽。

如果 DEBUG_SAVEALL 如果设置了,则所有无法访问的对象都将添加到此列表中,而不是释放。

在 3.2 版更改: 如果此列表不为空 interpreter shutdown ,A ResourceWarning 发出,默认为静默。如果 DEBUG_UNCOLLECTABLE 设置,另外打印所有无法收集的对象。

在 3.4 版更改: 跟随 PEP 442 ,对象 __del__() 方法不会以 gc.garbage 不再。

gc.callbacks

垃圾收集器将在收集前后调用的回调列表。将使用两个参数调用回调, 阶段info .

阶段 可以是以下两个值之一:

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

“停止”:垃圾收集已完成。

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

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

“已收集”:何时 阶段 是“停止”,即成功收集的对象数。

“无法收回”:何时 阶段 是“停止”,即无法收集和放入的对象数。 garbage .

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

收集有关垃圾收集的统计信息,例如收集不同代的频率以及收集所需的时间。

允许应用程序在出现在 garbage .

3.3 新版功能.

提供以下常量用于 set_debug()

gc.DEBUG_STATS

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

gc.DEBUG_COLLECTABLE

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

gc.DEBUG_UNCOLLECTABLE

打印找到的不可收集对象的信息(无法访问但收集器无法释放的对象)。这些对象将添加到 garbage 名单。

在 3.2 版更改: 同时打印 garbage 列出 interpreter shutdown ,如果不是空的。

gc.DEBUG_SAVEALL

设置后,找到的所有无法访问的对象都将附加到 垃圾 而不是被释放。这对于调试泄漏程序很有用。

gc.DEBUG_LEAK

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