谈谈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 相关文章推荐
pymssql ntext字段调用问题解决方法
Dec 17 Python
python实现电子词典
Apr 23 Python
python实现周期方波信号频谱图
Jul 21 Python
pandas数据集的端到端处理
Feb 18 Python
python selenium firefox使用详解
Feb 26 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
通过实例解析Python调用json模块
Dec 11 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
Python控制台实现交互式环境执行
Jun 09 Python
python/golang实现循环链表的示例代码
Sep 14 Python
pandas提升计算效率的一些方法汇总
May 30 Python
Python语言内置数据类型
Feb 24 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
CSS常用网站布局实例
2008/04/03 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
JQuery获得内容和属性方法解析
2020/05/30 jQuery
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
Python的装饰器用法学习笔记
2016/06/24 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
十一个高级MySql面试题
2014/10/06 面试题
会计系中文个人求职信
2013/12/24 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
白鹤梁导游词
2015/02/06 职场文书
周一给客户的问候语
2015/11/10 职场文书