tot*_*oth 2 python garbage-collection cpython python-internals
如果我的理解是正确的,CPython对象将在其引用计数达到零时立即删除.如果您的参考周期变得无法访问逻辑将无法工作,但有时解释器将尝试找到并删除它们(您可以通过调用gc.collect()手动执行此操作).
我的问题是,这些解释器触发的循环收集步骤何时发生?什么样的事件会引发他们?
我对CPython案例更感兴趣,但是很想知道PyPy或其他python实现的不同之处.
GC根据自上次GC运行以来发生的分配和解除分配的数量(增量之间的差值)定期运行.
为了决定何时运行,收集器会跟踪自上次收集以来的对象分配和解除分配的数量.当分配数减去解除分配数超过阈值0时,开始收集.
您可以访问当前计数gc.get_count()
; 这将返回3个计数GC轨道的元组(另外2个用于确定何时运行更深的扫描).
PyPy垃圾收集器的操作完全不同,因为PyPy中的GC进程负责所有解除分配,而不仅仅是循环引用.此外,PyPy垃圾收集器是可插入的,这意味着它运行的频率取决于您选择的GC选项.例如,当低于内存阈值时,默认的Minimark策略甚至根本不运行.
有关其策略的一些详细信息,请参阅RPython工具链垃圾收集器文档 ; 有关可调整内容的更多提示,请参阅Minimark 配置选项.
同样适用于Jython或IronPython; 这些实现依赖于主机运行时(Java和.NET)来处理它们的垃圾收集.