为什么Python要使用有明显缺陷的引用计数而不是像JavaScript一样的标记清除?
一、Python要使用有明显缺陷的引用计数的原因

Python要使用有明显缺陷的引用计数是因为引用计数最大的好处是回收及时:一个对象的引用计数归零的那一刻即是它成为垃圾的那一刻,同时也是它被回收的那一刻。
而这正是 mark-sweep 等 tracing GC 算法的劣势:一个对象成为垃圾之后,直到被下一轮 GC 清理掉之前,还要在内存中留存一段时间(floating garbage)。
Python 的 GC 设计是,对于内部不包含指向其他对象的引用的对象(如字符串、数值类型等),采用引用计数,因为这些对象根本不可能产生循环引用。对于 List、Map 等可能产生循环引用的对象,则采用 mark-sweep。所以我的理解是,Python 的 GC 设计一定程度上综合了两类 GC 算法的优点——即保证回收的完整性,又力求回收的及时性。
对List、Map、Set之类的引用计数也在起作用,mark-sweep只是备份。
整套引用计数机制嵌在ceval.c里了,所有对象都要被它折腾到。
换句话说不是List不被引用计数,而是List的引用计数如果自然降到零的话就自然按照引用计数机制释放;否则当cycle GC启动的时候就会对它处理。
不过通过引用计数来提高回收及时性这点仍然还是成立的。
延伸阅读:
二、垃圾回收
Garbage Collection,以下简称GC,是一种自动的内存管理机制,有许多不同的实现算法,Python中的GC,以引用计数为主,标记-清除和分代回收为辅。
在程序中定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,无用变量的内存空间,需要由程序员手动释放,这显然非常繁琐,而且一旦有所疏忽,就可能造成内存泄漏(Memory Leak)。当软件系统比较复杂、变量多的时候,程序员往往就忘记释放内存或者在不该释放的时候释放了内存。
有了GC,程序员就不需要再手动地去控制内存的释放,这一切可以交由语言本身来自动完成。GC本质上做了三件事情:1).为新生对象分配内存;2).垃圾检测;3).垃圾回收。GC是一门古老的艺术,大概在1960年就有了,发展至今,已经有相当多的算法,如标记-清除、引用计数、标记-压缩、分代回收等。GC的来源可能是由编程语言本身内置(如Java、C#)或是经由外面的库所提供,而非建制于语言内部,例如贝姆垃圾收集器就是一种可支持C/C++语言的自动内存管理工具。
GC较早起源于LISP语言,目前许多语言如Java、C#、Ruby、Python等都支持GC(值得注意的是,C++自身并不支持GC)。
猜你喜欢LIKE
相关推荐HOT
更多>>
什么是容器镜像仓库?
一、什么是容器镜像仓库容器镜像仓库是一种存储库(或存储库集合),可用来存储和访问容器镜像。容器镜像仓库可以为基于容器型应用开发提供支持...详情>>
2023-10-16 23:28:28
什么是商业智能?
一、什么是商业智能商业智能 (BI) 是利用人员和技术的力量来收集和分析组织在其战略和日常决策过程中使用的数据的过程。二、商业智能解决方案的...详情>>
2023-10-16 22:11:30
数据库、操作系统、编译原理是什么意思?
一、数据库、操作系统、编译原理是什么数据库(Database)是指用于存储和管理数据的系统。它是一个组织化的数据集合,可以通过结构化方式存储、...详情>>
2023-10-16 20:47:21
Android系统开发做什么?
一、Android系统开发做什么1、设计Android开发设计可以创建界面和交互元素,使应用程序更加互动和吸引人。设计师需要考虑多方面因素,如设计原...详情>>
2023-10-16 16:58:30
京公网安备 11010802030320号