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)。
最后建议,企业在引入信息化系统初期,切记要合理有效地运用好工具,这样一来不仅可以让公司业务高效地运行,还能最大程度保证团队目标的达成。同时还能大幅缩短系统开发和部署的时间成本。特别是有特定需求功能需要定制化的企业,可以采用我们公司自研的企业级低代码平台:织信Informat。 织信平台基于数据模型优先的设计理念,提供大量标准化的组件,内置AI助手、组件设计器、自动化(图形化编程)、脚本、工作流引擎(BPMN2.0)、自定义API、表单设计器、权限、仪表盘等功能,能帮助企业构建高度复杂核心的数字化系统。如ERP、MES、CRM、PLM、SCM、WMS、项目管理、流程管理等多个应用场景,全面助力企业落地国产化/信息化/数字化转型战略目标。 版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们微信:Informat_5 处理,核实后本网站将在24小时内删除。版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。