gc —垃圾收集器界面


该模块提供了到可选垃圾收集器的接口。它提供了禁用收集器,调整收集频率以及设置调试选项的Function。它还提供对收集器找到但无法释放的无法访问对象的访问。由于收集器补充了已经在 Python 中使用的引用计数,因此如果您确定程序未创建引用循环,则可以禁用收集器。可以pass调用gc.disable()禁用自动收集。要调试泄漏的程序,请调用gc.set_debug(gc.DEBUG_LEAK)。请注意,这包括gc.DEBUG_SAVEALL,导致将垃圾收集的对象保存在 gc.garbage 中以进行检查。

gc模块提供以下Function:

  • 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(* generation = None *)

    • 返回收集器跟踪的所有对象的列表,但不包括返回的列表。如果* generation *不为 None,则仅返回该一代中收集器跟踪的对象。

在 3.8 版中进行了更改:新的* generation *参数。

  • gc. get_stats ( )

    • 返回自解释器启动以来包含收集统计信息的三个每代词典的列表。密钥的数量将来可能会更改,但是当前每个词典将包含以下项目:
  • collections是收集此世代的次数;

  • collected是此代内收集的对象总数;

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

3.4 版的新Function。

  • gc. set_threshold(*阈值 0 * [,*阈值 1 * [,*阈值 2 *]])
    • 设置垃圾收集阈值(收集频率)。将阈值 0 设置为零将禁用收集。

GC 根据对象存活的收集扫描次数将其分为三代。新对象放置在最年轻的一代(第0代)中。如果对象在集合中幸存下来,则将其移入下一代。由于世代2是最古老的世代,因此该世代中的对象将在收集后保留在那里。为了确定何时运行,收集器会跟踪自上次收集以来的数字对象分配和释放。当分配数量减去取消分配数量超过* threshold0 时,收集开始。最初仅检查0世代。如果自检查世代1以来检查了世代0超过阈值 1 次以上,则也要检查世代1。类似地,* threshold2 *在收集世代2之前控制世代1的集合数。

  • gc. get_count ( )

    • 返回当前集合计数为(count0, count1, count2)的 Tuples。
  • gc. get_threshold ( )

    • (threshold0, threshold1, threshold2)Tuples 的形式返回当前收集阈值。
  • 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。通常,不会跟踪原子类型的实例,而不会跟踪非原子类型的实例(容器,用户定义的对象……)。但是,可以提供一些特定于类型的优化,以抑制简单实例的垃圾收集器占用空间(例如,仅包含原子键和值的字典):
>>> 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 版中的新Function。

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

3.7 版中的新Function。

  • gc. unfreeze ( )
    • 解冻永久代中的对象,然后将其放回最旧的一代。

3.7 版中的新Function。

  • gc. get_freeze_count ( )
    • 返回永久代中的对象数。

3.7 版中的新Function。

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

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

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

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

在版本 3.4 中进行了更改:在 PEP 442之后,具有del()方法的对象不再以gc.garbage结尾。

  • gc. callbacks
    • 垃圾回收器在回收前后将调用的回调列表。回调将使用两个参数* phase info *进行调用。
  • phase *可以是两个值之一:

Note

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

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

  • info *是一个字典,为回调提供更多信息。当前定义了以下键:

Note

“世代”:正在收集的最古老的世代。

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

“ uncollectable”:当* phase *为“ stop”时,无法收集并放入garbage的对象数。

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

Note

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

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

版本 3.3 中的新Function。

提供以下常量供set_debug()使用:

  • gc. DEBUG_STATS

    • 在收集期间打印统计信息。调整收集频率时,此信息可能很有用。
  • gc. DEBUG_COLLECTABLE

    • 在找到的可收集对象上打印信息。
  • gc. DEBUG_UNCOLLECTABLE

    • 打印找到的无法收集的对象(无法到达但无法被收集器释放的对象)的信息。这些对象将被添加到garbage列表中。

在版本 3.2 中进行了更改:如果不为空,还请在interpreter shutdown处打印garbage列表的内容。

  • gc. DEBUG_SAVEALL

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

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