为什么python对gc同时使用引用计数和markandsweep?

2024-09-27 14:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是,为什么python同时使用引用计数和gc的mark和sweep?为什么不做标记和清扫?

我最初的猜测是,使用引用计数可以很容易地移除非循环引用对象,这可能会在一定程度上加快标记和扫描,并立即获得内存。不知道我的猜测是否正确?

有什么想法吗?

非常感谢。


Tags: 对象内存标记gc计数marksweep程度
3条回答

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

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

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

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

My initial guess is that using reference counting can easily remove non-cyclic referenced objects, this may somewhat speed up mark-and-sweep and gain memory immediately. Don't know if my guess is right?

是的。只要refcount变为零并且对象可以被移除。这不会发生在循环引用对象中。AFAIK,mark and sweep是一个代价高昂的操作,实现它的最简单方法是在标记对象时“停止世界”。当遍历所有对象时,将释放未标记(可到达)的安迪对象。

相关问题 更多 >

    热门问题