谈谈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写xml文件的操作实例
Oct 05 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
基于python实现简单日历
Jul 28 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
python实现超级马里奥
Mar 18 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
python opencv通过按键采集图片源码
May 20 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
PHP新手上路(五)
2006/10/09 PHP
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
js jquery数组介绍
2012/07/15 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
回调函数的意义以及python实现实例
2017/06/20 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python高级用法总结
2018/05/26 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
python基于socket函数实现端口扫描
2020/05/28 Python
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
用python修改excel表某一列内容的操作方法
2021/06/11 Python