Python垃圾什么时候收集?

时间:2014-04-17 18:27:22

标签: python garbage-collection cpython python-internals

如果我的理解是正确的,那么CPython对象一旦引用计数达到零就会被删除。如果您的参考周期变得无法访问,逻辑将无法工作,但有时解释器将尝试找到并删除它们(您可以通过调用gc.collect()手动执行此操作。)

我的问题是,这些解释器触发的循环收集步骤何时发生?什么样的事件会引发他们?

我对CPython案例更感兴趣,但很想听听PyPy或其他python实现的不同之处。

1 个答案:

答案 0 :(得分:6)

GC根据自上次GC运行以来发生的分配和解除分配的数量(增量之间的差值)定期运行。

请参阅gc.set_threshold() function

  

为了决定何时运行,收集器会跟踪自上次收集以来的对象分配和解除分配的数量。当分配数量减去解除分配数量超过 threshold0 时,将开始收集。

您可以使用gc.get_count()访问当前计数;这将返回3个计数GC轨道的元组(另外2个用于确定何时运行更深的扫描)。

PyPy垃圾收集器的操作完全不同,因为PyPy中的GC进程负责所有解除分配,而不仅仅是循环引用。此外,PyPy垃圾收集器是可插入的,这意味着它运行的频率取决于您选择的GC选项。例如,当低于内存阈值时,默认的Minimark策略甚至根本不运行。

有关其策略的详细信息,请参阅RPython toolchain Garbage Collector documentation;有关可调整内容的更多提示,请参阅Minimark configuration options

同样适用于Jython或IronPython;这些实现依赖于主机运行时(Java和.NET)来处理它们的垃圾收集。