【问题标题】:Why does python use both reference counting and mark-and-sweep for gc?为什么python对gc同时使用引用计数和mark-and-sweep?
【发布时间】:2012-01-30 10:08:00
【问题描述】:

我的问题是为什么 python 对 gc 使用引用计数和标记和清除?为什么不只是标记和清除?

我最初的猜测是使用引用计数可以轻松删除非循环引用的对象,这可能会在一定程度上加快标记和清除并立即获得内存。不知道我猜对了吗?

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: python garbage-collection


    【解决方案1】:

    Python(该语言)没有说明它使用哪种形式的垃圾收集。主要实现(通常称为 CPython)就像您描述的那样。其他版本(例如 Jython 或 IronPython)使用纯粹的垃圾收集系统。

    是的,使用引用计数的早期集合有一个好处,但 CPython 使用它的主要原因是历史性的。最初没有针对循环对象的垃圾收集,因此循环导致内存泄漏。 C API 和数据结构主要基于引用计数原则。添加真正的垃圾回收后,无法破坏现有的二进制 API 和所有依赖它们的库,因此必须保留引用计数。

    【讨论】:

      【解决方案2】:

      引用计数比垃圾回收更快地释放对象。

      但由于引用计数无法处理无法访问的对象之间的引用循环,Python 使用垃圾收集器(实际上只是一个循环收集器)在这些循环存在时收集它们。

      【讨论】:

        【解决方案3】:

        我最初的猜测是使用引用计数可以轻松删除非循环引用的对象,这可能会在一定程度上加快标记和清除并立即获得内存。不知道我猜对了吗?

        是的。一旦引用计数变为零并且可以删除对象。这不会发生在循环引用的对象中。 AFAIK,标记和扫描是一项昂贵的操作,实现它的最简单方法要求您在标记对象时“停止世界”。当遍历所有对象时,释放未标记(可达)的对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2019-07-31
          • 1970-01-01
          • 2012-05-21
          • 1970-01-01
          • 2020-05-16
          相关资源
          最近更新 更多