5

如果我的理解是正确的,在 CPython 中,对象的引用计数一达到零就会被删除。如果您有无法访问的引用循环,则该逻辑将不起作用,但有时解释器会尝试找到它们并删除它们(您可以通过调用 gc.collect() 手动执行此操作)。

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

我对 CPython 案例更感兴趣,但很想听听这在 PyPy 或其他 python 实现中有何不同。

4

1 回答 1

9

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

查看gc.set_threshold()功能

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

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

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

有关其策略的一些详细信息,请参阅RPython 工具链垃圾收集器文档,以及有关可以调整的更多提示的 Minimark配置选项。

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

于 2014-04-17T18:29:47.287 回答