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