谈谈python垃圾回收机制


Posted in Python onSeptember 27, 2020

什么是垃圾回收机制?

首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来。

在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾。那当你有了女朋友了就不一样了,她会帮你收拾房间,把没用的垃圾都给你扔掉。

那在我们Python当中的垃圾回收承担的就是女朋友的角色,你们想象一下,你现在有一个轻度强迫症的女朋友一刻不停的跟在你的背后打扫卫生,你一放下脏碟子或者垃圾什么的,就已经帮你清理、打扫了

所以垃圾回收机制就是自动帮助我们管理内存,清理垃圾的一种工具

垃圾回收机制有什么用?

那我们现在先来想一想,我们平时在写程序的时候是不是会定义一些变量名,那这些变量名都是存在哪些地方呢?是不是都是存在内存里面,那当我们一直不停的定义变量是不是就会使我们内存空间的占有率增加,那我们的垃圾回收机制就会将一些没用的名字,没用的垃圾自动的回收起来。

识别垃圾对象,从垃圾对象那里回收内存

怎么进行垃圾回收
在我们Python当中采用的是引用计数机制为主,分代收集机制为辅的策略。

1、引用计数

在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的。从广义上来讲,引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。

引用计数的原理:

当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。
引用计数有一个致命的弱点就是是循环引用(也称交叉应用)。

循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。
这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然后由于相互引用的存在,
每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。

优点:

简单、直观
实时性,只要没有了引用就释放资源。

缺点:

维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。

2、标记-清除

“标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器对象(比如:list,set,dict,class,instance)都可能产生循环引用。

标记-清除原理:

“标记-清除”不改动真实的引用计数,而是将
集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副
本做任何的改动,都不会影响到对象生命走起的维护。

3、分代回收

分代回收原理:

将系统中的所有内存块根据其存活时间划分为不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

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

Python 相关文章推荐
Python FTP操作类代码分享
May 13 Python
Python读取键盘输入的2种方法
Jun 16 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Django使用HttpResponse返回图片并显示的方法
May 22 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
Django nginx配置实现过程详解
Sep 10 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
如何在python中处理配置文件代码实例
Sep 27 #Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 #Python
python 读取、写入txt文件的示例
Sep 27 #Python
python 动态绘制爱心的示例
Sep 27 #Python
python批量修改文件名的示例
Sep 27 #Python
python 绘制国旗的示例
Sep 27 #Python
python把一个字符串切开的实例方法
Sep 27 #Python
You might like
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
js 调整select 位置的函数
2008/02/21 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
基于IView中on-change属性的使用详解
2018/03/15 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
职业生涯规划书范文
2014/03/10 职场文书
《长相思》听课反思
2014/04/10 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
小学毕业感言200字
2015/07/30 职场文书