CPython何时进行垃圾回收?

7
如果我理解正确,在CPython中,对象的引用计数达到零后,它们就会被删除。如果您有变得不可访问的引用循环,这种逻辑将无法工作,但偶尔解释器会尝试找到它们并删除它们(您可以通过调用gc.collect()手动执行此操作)。
我的问题是,这些解释器触发的循环收集步骤是在什么时候发生的?哪些事件会触发这些步骤?
我更感兴趣的是CPython情况,但我很想听听在PyPy或其他Python实现中的区别。

1
你可能会对这个链接感兴趣:https://dev59.com/D2855IYBdhLWcg3wMBTV?rq=1 - user2555451
谢谢,我在寻找这个主题的答案时不知道怎么错过了它。 - toth
1个回答

11

垃圾回收器根据自上一次运行以来分配和释放对象的数量(差值)周期性地运行。

请参见gc.set_threshold()函数:

为了决定何时运行,垃圾回收器会跟踪自上次收集以来的对象分配和释放数量。当分配数减去释放数大于阈值0时,开始进行回收。

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

PyPy垃圾回收器的操作完全不同,因为在PyPy中,GC进程负责所有的释放,而不仅仅是循环引用。此外,PyPy垃圾回收器是可插拔的,这意味着它运行的频率取决于您选择了哪个GC选项。例如,默认的Minimark策略在内存阈值以下甚至不运行。

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

Jython或IronPython同样如此;这些实现依赖于主机运行时(Java和.NET)来处理垃圾回收。


谢谢,这正是我要找的。你知道调整这些数字是否值得吗? - toth
3
是的,如果您的应用程序频繁创建和销毁很多对象,而这些对象之间循环引用的情况非常少,那么您可以将阈值显著降低,以减少GC频繁进行垃圾回收所消耗的CPU时间,从而不必对您的应用程序造成影响。 - Martijn Pieters
谢谢,非常好的答案! - toth
1
通过“lower”,我的意思是增加它们的值,使它们不会被触发得太频繁。抱歉,可能有些令人困惑。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接