python 垃圾收集机制的实例详解


Posted in Python onAugust 20, 2017

 python 垃圾收集机制的实例详解

pythonn垃圾收集方面的内容如果要细讲还是挺多的,这里只是做一个大概的概括

Python最主要和绝大多数时候用的都是引用计数,每一个PyObject定义如下:

#define PyObject_HEAD          \ 
  Py_ssize_t ob_refcnt;        \ 
  struct _typeobject *ob_type; 
typedef struct _object { 
  PyObject_HEAD 
} PyObject;

每个pyobject都有一个refcnt来记录他们自己的引用数,一旦引用数为0,就进行回收

引用计数的优点在于实时性,一旦没有其他对象引用了,就能立马进行回收,看起来十分不错,但为什么好多语言都没有采用该方案,因为引用计数有一个致命的缺点,无法解决循环引用问题,比如:

a = [] 
b = [] 
a.append(b) 
b.append(a)

其实并没有其他变量引用a,b那么他们实际上应该被回收掉,但由于相互引用的关系,他们的引用数都为1,无法被回收。

在python中,相互引用的问题仅仅存在与容器里面,例如list,dictionary,class,instance。为了解决该问题,python引入了标记——清除和分代——回收另外两种机制。

事实上,python中的容器并没有之前讲的那么简单,在pyobject_head之前,还有一个PyGC_head,也就是专门用来处理容器的循环引用问题的。

typedef union _gc_head { 
  struct { 
    union _gc_head *gc_next; 
    union _gc_head *gc_prev; 
    Py_ssize_t gc_refs; 
  } gc; 
  long double dummy; /* force worst-case alignment */ 
} PyGC_Head;

所有创建的容器类的对象都会被记录到可收集对象链表中,通过上面的结构我们可以知道其实是构建了一个双向链表,这样我们就可以来跟踪所有可能产生循环引用的情况了。而像int,string等简单的不是容器类型的,只要引用技术为0,就会被回收。但是如果频繁的malloc和free会严重影响效率,所以python采用了大量的对象池来提高效率。

标记——清除包括了垃圾回收的两个方面:(1)寻找可以回收的对象(2)回收对象,python中的标记会从root object开始,遍历所有容器类对象,查找出可以通过引用来到达的一些对象,把他们放到由reachable维护的链表中,对于不能到达的放到unbreachable维护的链表中,此过程结束之后,对unreachable里面的元素进行回收即可。

那么如何对应之前循环引用的情况呢?python里面会产生一个有效的引用数,存在gc.gc_refs里面,像上面的a,b真实引用数为1,但有效的引用数为0(循环中的引用数都减1),由于不能直接改pyobjec里面的refcnt,否则会产生一系列问题,我们可以将有效的引用数记到gc.gc_refs里面,那么a,b 的真实有效引用数都为0,所以他们可以被回收。

下面是另外一种情况:

a = [] 
b = [] 
c = a 
a.append(b) 
b.append(a)

这里ab也是循环引用,但是多了c来引用a,通过计算循环中的有效引用计数可得a的引用数为1,b的引用数为0,看起来b应该被回收,但实际上因为a是不可被回收的,a又引用了b,所以b也会被放入在reachable链表中,不被回收,其gc.gc_refs还是会被置1的。

另外一种分代回收,是说内存中有的对象会频繁的malloc和free,有的则比较长久,如果一个对象经过多次垃圾收集和清除之后还存在的话,那么我们就可以认为,这个对象是长时间有用的,不用去频繁检测回收它。python中分为3代,分别是3个链表维护,0代最多维护700个对象,1代10个,2代10个,如果对象超过这个数了,就会调用标记——清除算法来进行回收。可以想到,0代的对象经过一段时间后会到1代2代中去,然后对它们的检测回收会相比于0代的不那么频繁了

要注意的是,python主要的机制还是引用技术,标记——清除和分代收集只是为了弥补引用计数的缺点而添加的,也就是说,后两者基本只在容器类的循环引用上能发挥作用

以上就是python 垃圾收集机制的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python复制与引用用法分析
Apr 08 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
python 实现tar文件压缩解压的实例详解
Aug 20 #Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 #Python
Python中input与raw_input 之间的比较
Aug 20 #Python
Python 基础教程之str和repr的详解
Aug 20 #Python
Python实现爬取需要登录的网站完整示例
Aug 19 #Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 #Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 #Python
You might like
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
js 动态选中下拉框
2009/11/26 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python绘制地震散点图
2019/06/18 Python
python实现猜拳小游戏
2020/04/05 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
办公室保洁员岗位职责
2013/12/02 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
社区两委对照检查材料
2014/08/23 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
2014年德育工作总结
2014/11/20 职场文书
理想国读书笔记
2015/06/25 职场文书
Python的property属性详细讲解
2022/04/11 Python