gc垃圾收集器界面


此模块提供可选垃圾收集器接口。它提供了禁用收集器,调整收集频率和设置调试选项的功能。它还提供对收集器找到但无法释放的无法访问的对象的访问。由于收集器补充了已在Python中使用的引用计数,因此如果您确定程序不创建引用周期,则可以禁用收集器。可以通过调用gc.disable()来禁用自动收集。调试泄漏的程序调用gc.set_debug(gc.DEBUG_LEAK)。请注意,这包括gc.DEBUG_SAVEALL,导致垃圾收集的对象被保存为ingc.garbage用于检查.

gc模块提供以下功能:

gc.enable

启用自动垃圾收集.

gc.disable ()

禁止自动垃圾收集.

gc.isenabled

如果启用了自动收集,则返回true.

gc.collect(generation=2)

没有任何参数,请运行完整的集合。可选参数generation可以是指定要收集哪一代(从0到2)的整数。如果世代号无效,则会引发ValueError。找到的无法找到的对象数量.

只要运行最高代(2)的完整集合集合,就会清除为许多内置类型维护的空闲列表。由于特定的实现,并非某些免费列表中的所有项目都可能被释放,尤其是float.

gc.set_debugflags

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

gc.get_debug ()

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

gc.get_objects

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

gc.get_stats()

从解释器启动开始,返回包含collectionstatistics的三个每代字典的列表。密钥的数量可能会在将来发生变化,但目前每个字典都包含以下内容:

  • collections收集这一代的次数;
  • collected是这一代收集的对象总数;
  • uncollectable是被发现无法收回的物品总数(因此被移到了garbage列表)这一代内部.

版本3.4.

gc.set_thresholdthreshold0[, threshold1[, threshold2] ]

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

GC将对象分为三代,具体取决于它们存活的收集扫描次数。新物体放置在最年轻的一代(代0)。如果一个对象在一个集合中存活,那么它就会移动到下一个老一代。自生成2是最古老的一代,那一代的物品在收藏后仍留在那里。为了决定何时运行,收集器会跟踪自上次收集以来的对象分配和解除分配的数量。当分配数量减去解除分配数量超过threshold0,collectionstarts。最初只检查一代0。如果发代0已被检查超过threshold1次,因为一代1已被检查,那么代1也进行了检查。同样地,threshold2在收集生成之前控制生成的集合数量1 2.

gc.get_count

将当前集合计数返回为(count0, count1,count2).

gc.get_threshold

将当前收集阈值作为(threshold0,threshold1, threshold2).

gc.get_referrers*objs

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

注意已经被解除引用但生存周期且尚未被垃圾收集器收集的对象可以列在最终的推荐人。要仅获取当前的活动对象,请在调用collect()之前调用get_referrers().

当使用get_referrers()返回的对象时必须小心,因为它们中的一些仍然可能正在构建中,因此暂时无效州。避免使用get_referrers()用于除调试之外的任何其他目的.

gc.get_referents (*objs)

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

gc.is_trackedobj

如果对象当前被垃圾收集器跟踪,则返回TrueFalse除此以外。作为一般规则,原子类型的实例未被跟踪,非原子类型的实例(容器,用户定义的对象……)是。但是,为了抑制简单实例的垃圾收集器占用空间(例如仅包含原子键和值的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.freeze()

冻结gc跟踪的所有对象 – 将它们移动到永久生成并忽略所有未来的集合。这可以在POSIXfork()调用之前使用,以使gc copy-on-write友好或加速收集。在POSIX fork()调用之前的集合也可以释放页面以供将来分配,这可能导致写入时复制建议禁用gcin master进程并在fork之前冻结并在子进程中启用gc .

版本3.7.

gc.unfreeze ()

Unfreeze永久世代中的物体,把它们放回最年代.

版本3.7.

gc.get_freeze_count ()

返回物体的数量在永久代中

新版本3.7.

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

gc.garbage

收集器发现无法访问但无法释放的对象列表(无法收集的对象)。从Python 3.4开始,此列表在大多数情况下应为空,除非使用非扩展类型的实例和非空的tp_delslot.

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

在版本3.2中更改:如果这个列表在翻译关机, 一个ResourceWarning发出,默认为静音。如果DEBUG_UNCOLLECTABLE此外,还打印了所有无法收集的物品.

版本3.4更改:以下PEP 442 ,对象有__del__()方法不会在gc.garbage中结束.

gc.callbacks

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

phase可以是两个值中的一个:

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

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

info是一个dict,为回调提供更多信息。目前定义了以下几个键:

“代”:收集的最老一代.

“收集”:当phase是“停止”,成功收集的对象数量.

“可收集”:当phase为“停止”时,无法收集的对象数量被放入garbage.

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

收集有关垃圾收集的统计数据,例如收集各代人的频率,以及收集的时间.

当应用程序出现在garbage.

3.3版本中的新功能

提供以下常量以用于set_debug()

gc.DEBUG_STATS

收集期间打印统计信息调整收集频率时,此信息非常有用.

gc.DEBUG_COLLECTABLE

有关可收集物品的打印信息.

gc.DEBUG_UNCOLLECTABLE

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

更改为版本3.2:同时打印garbage列表的内容 interpreter shutdown ,如果它不是空的.

gc.DEBUG_SAVEALL

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

gc.DEBUG_LEAK

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

评论被关闭。