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