详细分析Python垃圾回收机制


Posted in Python onJuly 01, 2020

引入

为什么要有垃圾回收机制

Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有用了就需要被清理释放掉该变量所占据的内存空间。在一些较为低级的语言中(比如:C语言,汇编语言)对于内存空间的释放是需要编程人员来手动进行的,这种与底层硬件直接打交道的操作是十分的危险与繁琐的,而基于C语言开发而来的Python为了解决掉这种顾虑则自带了一种垃圾回收机制,从而让开发人员不必过分担心内存的使用情况而可以全身心的投入到开发中去。

>>> name = "yunya" #yunya 准备改名
>>> name = "yunyaya" #原本yunya这个名字不使用了,现在必须清理掉它否则将会占据内存空间,所幸Python的垃圾回收机制会帮我清理掉 "yunya"
>>

堆区和栈区的概念

如果你看我之前写的那篇文章关于Python变量的底层原理的话那么想必对堆区和栈区内存有了一定的了解。如果没有看过那么也没有关系,链接如下:

底层工作原理

引用计数

引用计数说白了就是来对堆区的变量值绑定的栈区变量名来计数。如图:

详细分析Python垃圾回收机制

当使用del或者对变量名重新赋值后,该变量值的引用计数就会 -1 。当引用计数为 0 时候下次 Python内存回收机制 进行内存扫描时便会将该变量值当做垃圾进行回收。

详细分析Python垃圾回收机制

 那么这里就是Python内存回收机制中最基本的也最常用的引用计数介绍。

循环引用-内存泄漏

引用计数虽然作为Python内存回收机制中最经常使用的一种机制,但是它本身也是具有一定的缺点。我们来看下面这段代码:

>>> l1 = [1,2,3]
>>> l2 = [1,2,3,l1]
>>> l1.append(l2)  #append()方法用于向列表中添加一个元素值
>>> l1
[1, 2, 3, [1, 2, 3, [...]]]
>>> l2
[1, 2, 3, [1, 2, 3, [...]]]
>>>

现在l1和l2全部作为互相引用了。那么对于这种引用方式叫做循环引用(也被称为交叉引用),循环引用会带来一个问题:

  1. l1 变量值 的引用计数 目前为 2
  2. l2 变量值 的引用计数 目前为 2
  3. 当使用 del l1 与 del l2 后呢?
  4. 它们的引用变量都减1,但是引用方式的变量名都互相删除了,按理说这些变量值都成了垃圾变量。单根据引用计数是无法清理这些垃圾变量的。

 详细分析Python垃圾回收机制

>>> del l1
>>> del l2
>>> #现在怎么访问 li1 或者 li2 呢?访问不到,但是他们的变量值依然存在于内存,引用计数从2变为1

标记-清除

标记清除的意思在于当应用程序可用内存空间即将被耗尽时便开始扫描栈区,并且会顺着栈区变量名对堆区中的变量值做一个标记,如果堆区中存在没有与栈区变量名做对应关系的数据则会被认为是垃圾数据从而被Python垃圾回收机制清理。

详细分析Python垃圾回收机制

效率问题解决方案-分代回收

基于引用计数的垃圾回收机制每一次执行清理操作前都会将整个堆区的变量值的引用计数做一次遍历统计。这样做是非常消耗时间的,所以Python垃圾回收机制为了效率的提升加入了分代回收的策略。

详细分析Python垃圾回收机制

参考文献

以上就是详细分析Python垃圾回收机制的详细内容,更多关于Python垃圾回收机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python操作MySQL简单实现方法
Jan 26 Python
Django实现图片文字同时提交的方法
May 26 Python
python使用psutil模块获取系统状态
Aug 27 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
Python自带的IDE在哪里
Jul 01 #Python
如何解决cmd运行python提示不是内部命令
Jul 01 #Python
python中执行smtplib失败的处理方法
Jul 01 #Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 #Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 #Python
学python需要去培训机构吗
Jul 01 #Python
详解python logging日志传输
Jul 01 #Python
You might like
Destoon模板制作简明教程
2014/06/20 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Python实现图像几何变换
2015/07/06 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
python的sys.path模块路径添加方式
2020/03/09 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
精彩的推荐信范文
2013/11/26 职场文书
学校门卫工作职责
2013/12/07 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
内勤岗位职责
2015/02/10 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015年检验科工作总结
2015/04/27 职场文书
退休教师追悼词
2015/06/23 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
MySQL创建管理HASH分区
2022/04/13 MySQL
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL