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 垃圾收集机制的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章:
电脑免费海报制作网站推荐,招聘海报哪个网站多?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
如何通过商城免费建站系统源码自定义网站主题?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
制作网站怎么制作,*游戏网站怎么搭建?
如何零基础在云服务器搭建WordPress站点?
C++中引用和指针有什么区别?(代码说明)
全景视频制作网站有哪些,全景图怎么做成网页?
如何快速生成可下载的建站源码工具?
如何通过虚拟主机快速完成网站搭建?
北京网站制作网页,网站升级改版需要多久?
深圳网站制作案例,网页的相关名词有哪些?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何通过服务器快速搭建网站?完整步骤解析
Python路径拼接规范_跨平台处理说明【指导】
香港网站服务器数量如何影响SEO优化效果?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
定制建站方案优化指南:企业官网开发与建站费用解析
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
c++ stringstream用法详解_c++字符串与数字转换利器
如何快速搭建个人网站并优化SEO?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
制作企业网站建设方案,怎样建设一个公司网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何在阿里云部署织梦网站?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
小型网站制作HTML,*游戏网站怎么搭建?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站之星收费标准详解:套餐费用及年费价格表一览
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
建站之星备案流程有哪些注意事项?
如何用免费手机建站系统零基础打造专业网站?
公众号网站制作网页,微信公众号怎么制作?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
制作网站的公司有哪些,做一个公司网站要多少钱?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
微信小程序 input输入框控件详解及实例(多种示例)
昆明高端网站制作公司,昆明公租房申请网上登录入口?
*请认真填写需求信息,我们会在24小时内与您取得联系。