谈谈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实现队列的方法
May 26 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
Python中格式化format()方法详解
Apr 01 Python
python算法演练_One Rule 算法(详解)
May 17 Python
Python实现图片转字符画的示例
Aug 22 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python面向对象魔法方法和单例模块代码实例
Mar 25 Python
Python 忽略文件名编码的方法
Aug 01 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
php商品对比功能代码分享
2015/09/24 PHP
php 常用的系统函数
2017/02/07 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
如何在vue 中引入使用jquery
2020/11/10 jQuery
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python3编写C/S网络程序实例教程
2014/08/25 Python
列举Python中吸引人的一些特性
2015/04/09 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
详解Django配置JWT认证方式
2020/05/09 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
如何理解委托
2012/01/06 面试题
高中毕业生自我鉴定范文
2013/09/26 职场文书
体现团队精神的口号
2014/06/06 职场文书
先进班组事迹材料
2014/12/25 职场文书
退货证明模板
2015/06/23 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书