CPython垃圾什么时候收集?

tot*_*oth 2 python garbage-collection cpython python-internals

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

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

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

Mar*_*ers 6

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

gc.set_threshold()功能:

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

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

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

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

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

  • @toth:是的,如果您的应用程序经常创建并销毁很多具有非常低的循环引用率的对象,您可以显着降低阈值以减少GC从您的应用程序带来不必要的CPU时间的可能性太频繁的垃圾收集运行. (3认同)