如果我的理解是正确的,那么CPython对象一旦引用计数达到零就会被删除。如果您的参考周期变得无法访问,逻辑将无法工作,但有时解释器将尝试找到并删除它们(您可以通过调用gc.collect()手动执行此操作。)
我的问题是,这些解释器触发的循环收集步骤何时发生?什么样的事件会引发他们?
我对CPython案例更感兴趣,但很想听听PyPy或其他python实现的不同之处。
答案 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)来处理它们的垃圾收集。