首页 / 知识
python详解Python垃圾回收机制
2023-11-12 13:01:00
引用计数
python默认的垃圾收集机制是“引用计数”,每个对象维护了一个ob_ref字段。它的优点是机制简单,当新的引用指向该对象时,引用计数加1,当一个对象的引用被销毁时减1,一旦对象的引用计数为0,该对象立即被回收,所占用的内存将被释放。它的缺点是需要额外的空间维护引用计数,不过最主要的问题是它不能解决“循环引用”。
什么是循环引用?A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数虽然都为1,但显然应该被回收,例子:
a={}#a的引用为1
b={}#b的引用为1
a['b']=b#b的引用增1,b的引用为2
b['a']=a#a的引用增1,a的引用为2
dela#a的引用减1,a的引用为1
delb#b的引用减1,b的引用为1
在这个例子中,del语句减少了a和b的引用计数并删除了用于引用的变量名,可是由于两个对象各包含一个对方对象的引用,虽然最后两个对象都无法通过名字访问了,但引用计数并没有减少到零。因此这个对象不会被销毁,它会一直驻留在内存中,这就造成了内存泄漏。为了解决循环引用问题,Python引入了标记-清除和分代回收两种GC机制。
标记清除
标记——清除(Mark——Sweep)是一种基于追踪(Tracing)回收技术实现的垃圾回收算法,对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(rootobject)出发,沿着有向边遍历对象,可达的对象标记为有用的对象,不可达的对象就是要被清除的对象。所谓根对象就是一些全局引用对象和函数栈中的引用,这些引用所引用的对象是不可被删除的。
标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。
分代回收
分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。
分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象。
以上内容为大家介绍了python培训之详解Python垃圾回收机制,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们
最新内容
相关内容
python如何确定是否为可迭代对象
python如何确定是否为可迭代对象,培训,元素,索引,对象,整数,字典,函数,类型,下标,模块,迭代可以理解为,任意的集合使用for循环遍历python中,迭python怎么判断某一对象是否为字典
python怎么判断某一对象是否为字典,培训,名称,代码,情况,类型,实例,元素,字典,函数,对象,我们经常需要在Python代码中确定某个实例是什么类型python如何查看对象属性
python如何查看对象属性,培训,网络,系统,函数,对象,属性,变量,示例,实例,模块,在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要python新手如何系统学习
python新手如何系统学习,基础,系统,状态,环境,中级,培训,阶段,代码,概念,管理,我们可把学习python分为4个阶段,每个阶段需要完善的掌握知识点,ppython如何释放内存
python如何释放内存,培训,情况,名称,对象,赋值,内存,别名,变量,语句,函数,关于Python中的内存释放问题首先就不得不提到Python解释器在何种情pythonos怎样处理系统文件
pythonos怎样处理系统文件,系统,培训,环境,代码,文件,环境变量,模块,操作系统,类型,代表,pythonos怎样处理系统文件1、获取系统类型对代码进关于python:跨平台,与语言无关的GUI
关于python:跨平台,与语言无关的GUI标记语言?,关于python:跨平台,与语言无关的GUI标记语言?,应用程序,转向,学习,我是,Cross Platform, LanCSS页面布局技术知识分享
CSS页面布局技术知识分享,CSS,页面,布局,技术,知识,分享,CSS,页面,布局,, CSS页面布局技术允许我们拾取网页中的元素,并且控制它JavaScript数组中使用名字来索引
JavaScript数组中使用名字来索引,JavaScript,数组,中,使用,名字,来,索引,数组,中,, 数组中使用名字来索引 许多程序语言都允许使给已有的函数对象增加属性或者方法
给已有的函数对象增加属性或者方法,给,已,有的,函数,对象,增加,属性,或者,方法,,给已有的函数对象增加属性或者方法格式:构造函数名.Java面向对象基础
Java面向对象基础,Java,面向,对象,基础,一,、,前言,我们,上次,,一、前言我们上次学过java的方法,现在我们来学习新的一篇,也算是java