CPython内存管理机制
CPython(Python解释器)是如何管理对象的生命周期
目前的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄露,悬空指针等bug埋下隐患。
对于一个字符串、列表、类甚至数值都是对象,且定位简单易用的语言,自然不会让用户去处理如何分配回收内存的问题,而python恰恰就是这样的简单易用语言。
python里也同java一样采用了垃圾收集机制,不过不一样的是:
- 引用计数机制为主
- 标记清除和分代收集两种机制为辅
的策略
1.引用计数
每一个Python对象都有一个引用计数器----用于记录有多少其他对象指向(引用)这个对象。它存储在变量refcnt中,并通过调用C宏Py_INCREF实现引用计数增加和Py_DECREF实现引用计数减少的操作。 Py_DECREF更复杂点,当引用计数器到零时,它会运行该对象的释放函数,回收该类型的对象。
通常以下两种情况你需要考虑这个宏定义:实现自己创建数据结构,或者修改已经存在的Python C API。如果你使用Python内置的数据结构,那么不需要任何操作。
如果想不增加引用计数,可以使用弱引用或weakrefs 引用对象。 Weakrefs对于实现缓存和代理非常有用。
2.垃圾回收(GC)
引用计数是在Python 2.0之前管理对象生命周期的唯一方法。它有一个弱点,它不能删除循环引用的对象。 循环引用的最简单的例子是对象引用自身。
通常情况下,可以避免使用循环引用对象,但是有时是不可避免的(例如:长时间运行的程序)。
为了解决这个问题,Python 2.0引入了新的垃圾回收机制。 新GC与其他语言运行时(如JVM和CLR)的GC的主要区别在于,它仅用于寻找存在引用计数的循环引用。
循环引用只能由容器对象创建,因此Python GC不会跟踪整数,字符串等类型。
GC将对象分为3代,每一代对象都有一个计数器和一个阈值。当对象被创建时,阈值会被自动地指派为0,也就是第0代对象。当计数器大于某个阀值,GC就会运行在当前对象代上,回收该对象。没被回收的对象会被移至下一代,并且将相应的计数器复位。下一代的对象保留在下一代。
在Python 3.4之前,GC有一个致命缺点----每个对象重载了del()方法,因为每个对象都可以相互引用,所以GC不知道该调用那个对象的del()方法,这会导致GC直接跳过这些对象。具体详细信息可以参考 gc.garbage并且循环引用需要编程人员手动打破。
Python3.4介绍了一种最终的解决方法finalization approach ,现在的GC可以打破对象的循环引用,而不在使用gc.garbage介绍的方法去回收对象。
此外,值得一提的是,如果你确定你的代码没有创建循环引用(或者你不关心内存管理),那么你可以只依赖引用计数器自动管理内存,而不使用GC去管理内存。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
IBM借QISKit打造基于云平台的量子计算
IBM量子体验(Quantum Experience)团队已将量子计算软件QISKit开源,根据量子计算和信息科学家Jay Gambetta的介绍,QISKit可供开发者使用Python体验IBM的云端量子处理器。 IBM QISKit包含三个主要组件: 使用Python编写的官方QISKit API客户端,可执行pip install IBMQuantumExperience安装,随后可按照下列范例使用: api = IBMQuantumExperience("token", config) qasm = 'OPENQASM 2.0; include "qelib1.inc"; qreg q[5]; creg c[5];\ h q[0];
- 下一篇
java学习笔记--数组操作(Collections和Arrays)
关于数组操作 4.Collections与Arrays 集合框架中的工具类:特点:该工具类中的方法都是静态的。 Collections:常见方法: 1,对list进行二分查找: 前提该集合一定要有序。 int binarySearch(list,key); 求元素所在的索引 (有自然顺序)常用 //必须根据元素自然顺序对列表进行升级排序 //要求list 集合中的元素都是Comparable 的子类。 int binarySearch(list,key,Comparator); 如果是自定义类求键的索引 要传入比较器 key是键 2,对list集合进行排序。 sort(list); //对list进行排序,其实使用的事list容器中的对象的compareTo方法 sort(list,comaprator); 常用 //按照指定比较器进行排序 3,对集合取最大值或者最小值。 常用 max(Collection) max(Collection,comparator) 不具备自然顺序的 min(Collection) min(Collection,comparator) 4,对list集合进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装