当前位置:首页  >  关于学院  >  技术干货  >  Java技术干货  >  正文

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

来源:千锋教育
发布时间:2023-10-10 20:55:07
分享

一、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)。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

相关推荐

  • javaoa系统有哪些模块? 一、权限管理模块权限管理模块是Java OA系统的核心模块之一,也是整个系统的基础。该模块通过对系统用户进行身份验证、权限分配、访问控制等管理,确保了系统的安全性和稳定性。权限管理模块通常包括用户管理
  • Java中遍历数据结构Enumeration和Iterator相比有什么不同? 一、Java中遍历数据结构Enumeration和Iterator的不同1、功能和用法不同 Enumeration是Java早期版本中引入的接口,它只有两个方法:hasMoreElements()和n
  • 为什么JavaScript绝大多数内置函数都是native code? 一、JavaScript绝大多数内置函数都是native code的原因1、提高程序执行效率首先,内置函数作为引擎内部的一部分,可以提高JavaScript程序的执行效率。这是因为,内置函数的实现是直
  • C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么? 一、C、C++、Java、JavaScript、PHP、Python、Ruby 的用途C主要用于底层模块,服务应用和嵌入式应用;C++主要用于上层服务程序,应用API,大型3D游戏;Java主要用于服
  • C++、java都将线程共享的变量等放到堆内存中,为什么选择堆这种数据结构? 一、C++、java为什么选择堆这种数据结构效率:执行堆排序所需的时间呈对数增长,而其他算法可能随着要排序的元素数量的增加而呈指数级增长。这种排序算法非常有效。内存使用: 内存使用是最小的,因为除了保
  • Java 的作用是什么? 一、Java 的作用1、跨平台Java的跨平台特性是其最大的优势之一,因为Java代码可以在各种不同操作系统和硬件平台上运行,这是因为Java程序通过Java虚拟机(JVM)来执行,JVM将Java代