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
¶ 将在收集之前和之后由垃圾收集器调用的回调列表。将使用两个参数(phase 和 info)调用回调。
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 shutdown 的
garbage
列表的内容,如果它不是空的。
-
gc.
DEBUG_SAVEALL
¶ 设置时,找到的所有不可达对象将附加到 garbage,而不是被释放。这对于调试泄漏程序很有用。
-
gc.
DEBUG_LEAK
¶ 收集器打印泄漏程序信息(等于
DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL
)所需的调试标志。