在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
相信大家在面试中常常会碰到有关垃圾回收的问题,的确,Python和其他很多编程语言一样,都自带垃圾回收机制。本文主要和大家来分析一下Python中的垃圾回收算法。首先我们要知道,GC计算机术语指的是垃圾回收。而Python中的垃圾回收是以引用计数为主,但是为了弥补其算法的不足,所以又引入了标记-清除和分代收集算法为辅。

一、引用计数
刚开始学习Python的时候总是会有人告诉你,万物皆对象是一大特色。在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。
// object.h
struct _object {
Py_ssize_t ob_refcnt; # 引用计数值
struct PyTypeObject *ob_type;
} PyObject;
引用计数的意思就是,一个对象在它刚被New出来呱呱(gugu不是guagua)坠地的时候因为被New方法引用了所以他的引用计数就是1,如果它被引用(也就是在之前的基础上 例如:b=a,被丢入函数列表等等被引用就会在引用计数上加1),如果引用它的对象被删除的时候(在之前的基础上DEL b)那么它的引用计数就会减少一一直到当它的引用计数变为0的时候,垃圾回收机制就会找上门做掉它(回收),脑补一下 :开门我是查水表的。
优点:高效,易于实现,实时性。一旦没有引用,内存就直接释放了。处理回收内存的时间分摊到了平时,对象有确定的生命周期。
缺点:维护性高,虽然简单实时,但是额外占用了一部分资源,虽然逻辑简单,但是比较麻烦。另外它还有不能解决的情况:--->循环引用,如下所示:
a=[1,2]
b=[2,3]
a.append(b)
b.append(a)
DEL a
DEL b
二、标记-清除算法
标记-清除就是用来解决循环引用的问题的只有容器对象才会出现引用循环,比如列表、字典、类、元组。 首先,为了追踪容器对象,需要每个容器对象维护两个额外的指针, 用来将容器对象组成一个链表,指针分别指向前后两个容器对象,方便插入和删除操作。试想一下,现在有两种情况:
A:
a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a
del b
B:
a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a
在标记-清除算法中,有两个集中营,一个是root链表,另外一个是unreachable链表。对于情景A,原来再未执行DEL语句的时候,a,b的引用计数都为2,但是在DEL执行完以后,a,b引用次数互相减1。a,b陷入循环引用的圈子中,然后标记-清除算法开始出来做事,找到其中一端a,开始拆这个a,b的引用环,去掉以后发现,a,b循环引用变为了0,所以a,b就被处理到unreachable链表中直接被做掉。
对于情景B,简单一看那b取环后引用计数还为1,但是a取环,就为0了。这个时候a已经进入unreachable链表中,已经被判为死刑了,但是这个时候,root链表中有b。如果a被做掉,那世界上还有什么正义... ,在root链表中的b会被进行引用检测引用了a,如果a被做掉了,那么b就...凉凉,一审完事,二审a无罪,所以被拉到了root链表中。
三、分代回收算法
了解分类回收,首先要了解一下,GC的阈值,所谓阈值就是一个临界点的值。随着你的程序运行,Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,创建==释放数量应该是这样子。但是如果存在循环引用的话,肯定是创建>释放数量,当创建数与释放数量的差值达到规定的阈值的时候,分代回收机制就开始起作用了。
垃圾回收=垃圾检测+释放。Python将所有的对象分为0,1,2三代;所有的新建对象都是0代对象;当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。Python在创建对象之前,会创建一个链表,零代链表,只不过这个链表是空的。每当你创建一个对象,Python便会将其加入到零代链表。
以上就是Python中GC的垃圾回收算法分析,大家都看懂了吗?如果对于引用计数,标记-清除和分代收集算法还有什么问题,可以上博学谷官网咨询在线老师,进行更为深入细致的学习。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
如何自学Python爬虫?新手入门教程
如何自学Python爬虫?在大家自学爬虫之前要解决两个常见的问题,一是爬虫到底是什么?二是问什么要用Python来做爬虫?爬虫其实就是自动抓取页面信息的网络机器人,至于用Python做爬虫的原因,当然还是为了方便。本文将为大家提供一份详细的新手入门教程,带大家从入门到精通Python爬虫技能。
7292
2019-11-21 11:55:13
Python基础算法有哪些?作用是什么?
算法是解决问题的思想和实施步骤,而编程是算法的实现,把人的语言转换成某种的编程语言。常见内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
4759
2021-04-09 14:08:31
表单标签有哪些?分别做什么?
表单用于搜集不同类型的用户输入,然后把用户数据提交到服务器后台,表单开发中用到了很多标签,如<form>标签 、<label>标签、<input>、<textarea> 标签、<select> 标签等,接下来我们一起来学习下。
13963
2021-12-13 15:10:25
MySQL数据库的基本使用之数据库
MySQL数据库的基本使用之数据库,数据库是存储和管理数据的仓库,数据按照一定的格式进行存储。数据库起到存储和管理数据的作用。
3273
2022-01-10 14:06:11
分组和聚合函数的组合怎么使用?代码怎么写?
分组和聚合函数的组合怎么使用?代码怎么写?分组函数group by,聚合函数COUNT、MAX、MIN、AVG、SUM。分组聚合函数也可称之为多行函数,输入多个行构成得一个行集,将查询对象按肯定条件分组,然后对每一个组进行聚合分析。
4566
2022-01-21 11:17:58
