我的问题是为什么python同时使用引用计数和gc的标记和扫描?为什么不只是标记和扫描?
我最初的猜测是使用引用计数可以轻松删除非循环引用的对象,这可能会加速标记和扫描并立即获得内存。不知道我的猜测是否正确?
有什么想法吗?
非常感谢。
答案 0 :(得分:18)
Python(该语言)没有说它使用哪种形式的垃圾收集。主要实现(通常称为CPython)就像您描述的那样。其他版本如Jython或IronPython使用纯垃圾收集系统。
是的,早期收集有一个好处,引用计数,但CPython使用它的主要原因是历史性的。最初没有循环对象的垃圾收集,因此循环导致内存泄漏。 C API和数据结构主要基于引用计数原理。当添加真正的垃圾收集时,不能打破现有的二进制API和依赖它们的所有库,因此必须保留引用计数。
答案 1 :(得分:14)
引用计数比垃圾回收更快地释放对象。
但由于引用计数无法处理无法访问的对象之间的引用循环,因此Python使用垃圾收集器(实际上只是一个循环收集器)来收集这些循环。
答案 2 :(得分:1)
我最初的猜测是使用引用计数可以轻松删除非循环引用的对象,这可能会加速标记和扫描并立即获得内存。不知道我的猜测是否正确?
是。一旦refcount变为零并且可以移除对象。这不会发生在循环引用的对象中。 AFAIK,标记和扫描是一项代价高昂的操作,最简单的实现方法要求您在标记对象时“停止世界”。遍历所有对象时,释放未标记(可达)的对象。