从我读过的关于 cpython 的内容来看,它似乎确实引用计数 + 一些额外的东西来检测/释放指向彼此的对象。(如果我错了,请纠正我)。有人可以解释一下额外的东西吗?这也保证*没有循环泄漏吗?如果没有,是否有任何研究证明可以添加到引用计数以使其永不泄漏*的算法?这会只是经常运行非引用计数跟踪 gc 吗?
*折扣使用外部函数接口的模块的错误和问题
从我读过的关于 cpython 的内容来看,它似乎确实引用计数 + 一些额外的东西来检测/释放指向彼此的对象。(如果我错了,请纠正我)。有人可以解释一下额外的东西吗?这也保证*没有循环泄漏吗?如果没有,是否有任何研究证明可以添加到引用计数以使其永不泄漏*的算法?这会只是经常运行非引用计数跟踪 gc 吗?
*折扣使用外部函数接口的模块的错误和问题
正如文档中所解释的gc.garbage
,不能保证不会发生泄漏;__del__
具体来说,默认情况下不收集带有方法的循环对象。对于此类对象,必须手动断开循环链接以启用进一步的 GC。
根据我通过浏览CPython 源代码的理解,解释器将所有对象的引用保持在其控制之下。“额外”垃圾收集器通过堆运行类似标记和清除的算法,记住每个对象是否可以从“外部”访问,如果不能,则删除它。(GC 是分代的,但它可以从gc
带有generation
参数的模块显式运行。)
我能想到的满足您的标准的唯一有效算法确实是一个“完整的” GC 算法来增加引用计数,这似乎是在 Python 中实现的。不过,我不是这些问题的专家。