问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python垃圾回收算法之分代回收

发布网友 发布时间:2024-10-04 00:17

我来回答

1个回答

热心网友 时间:2024-10-07 05:32

分代回收是java垃圾回收的核心算法。该算法是基于这样的一个统计事实:对于程序,存在一定比例的内存块的生存周期比较短,而剩下的内存块,生存周期会比较长,甚至从程序开始持续到程序结束。生存期较短的对象大致能占到80%-90%。

因此,可以认为对象存在时间越长,越不可能是垃圾,应该越少取进行收集。

这样在执行标记-清除算法时可以有效减少遍历的对象数目,从而提高垃圾回收的效率,是一种以空间来换取时间的策略。

1.分代的内容

python将所有对象分为0,1,2三代。

所有新建对象都是0代。

当某一代对象经历过垃圾回收,依然存活,就会被归入下一代对象。

每个代都由一个gc_generation结构体来进行维护。结构体中有三个变量。

head字段:可收集对象链表头部,代中的对象通过该链表维护。

threshold字段:仅当count超过本阈值时,python垃圾回收操作才会扫描本代对象。

count字段:计数器,不同代统计项目不一样。

每个gc_generation结构体链表头节点head字段都指向自己,也就是说每个可收集对象链表一开始都是空的。计数器字段count字段都被初始化为0,而threshold字段则有各自的策略。

2.分代回收策略

初始化完成后,3个代对应的gc_generation数组大致如下:

python调用PyObject_GC_Alloc为需要跟踪的对象分配内存时,该函数将初生代count计数器加1,随后对象将接入初生代对象链表。当python调用PyObject_GC_Del释放垃圾对象内存时,该函数将初生代count计数器减1。PyObject_GC_Alloc自增count后如果超过阈值700,将调用collect_generations执行一次垃圾回收(GC)。

collect_generations函数从老生代开始,逐个遍历每个生代,找出需要执行回收操作的最老生代。随后调用collect_with_callback函数开始回收该生代,而该函数最终调用collect函数。

collect函数处理某个生代时,先将比他们年轻的生代计数器count重置为0,然后将他们的对象链表移除,与自己的拼接在一起后执行GCs算法,最后将下一个生代计数器加1。

总结起来有以下八点

(1)系统每新增 701 个需要 GC 的对象,Python 就执行一次 GC 操作

(2)一个对象创建后,随着时间推移将被逐步移入老生代,回收频率逐渐降低

(3)每执行 11 次新生代 GC ,触发一次中生代 GC

(4)每执行 11 次中生代 GC ,触发一次老生代 GC (老生代 GC 还受其他策略影响,频率更低)

(5)每次 GC 操作需要处理的生代可能是不同的,由 count 和 threshold 共同决定

(6)某个生代需要执行 GC ( count>hreshold ),在它前面的所有年轻生代也同时执行 GC

(7)对多个代执行 GC,Python 将它们的对象链表拼接在一起,一次性处理

(8)GC 执行完毕后,count 清零,而后一个生代 count 加 1

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 母猪打什么消炎针 提升财运的方法 如何提升运气财运 金鹰网为什么现在不能点播 如何下载金鹰网芒果电视台的视频 教师资格证面试步骤会有哪些 金鹰网的视频怎么下? 急急急!!!女生适合学水文与水资源工程还是工程造价??? 学艺术设计专业的女生,要去建筑单位上班,做什么比较好? ...女生,问一下,女生在哪些方面就业较好,请高人指点,... ...这些专业哪个更好就业?更有前途?请高人指点迷津~先谢谢啦~_百度知... 如何一直隐藏QQ聊天框边上的QQ秀啊 我是学建筑的女生 但不想干建筑方面的 不适合我 接下来要找工作了_百... word下排文字如何与上排文字对齐word下排文字如何与上排文字对齐在一... word表格内两行文字怎样对齐word表格内两行文字怎样对齐在一起 联想一般行政人员工资不到3K是真的吗 怎样将rtk坐标转换到cad中? 膝盖半月板疼怎么恢复 半月板损伤用什么药 QQ聊天框隐藏QQ秀的那个按键,就是聊天框和QQ秀之间按键(隐藏QQ秀的按 ... 为什么我一打开QQ聊天窗口就自动把QQ秀的地方给隐藏了. JVM总结(十一):G1分代回收原理深度图解:为什么回收性能比传统GC更好... 百度云盘的链接为什么打不开? TM聊天窗口如何简化,像QQ聊天工具一样,把右侧的个人头隐藏。谢谢各位... ...栏里看不到QQ空间那一行资料.只剩图标,怎么设置的 求《美丽的神话》笛子古筝小提琴版本的纯音乐 我想买跟大降B笛子 玩转气保焊你只需知道这些个技巧,离焊接大神就不远了! 笔记电脑进水了怎么办 ...没去,老婆要跟我离婚,怎么办? 她发的话: 我没带钱过去,就连个红包也... 双方家长已经见过面,那对方外公外婆生日我家要一起去吗? ...严重吗?我应该怎么跟她说? 她发的话: 我没带钱过去 ...回复没有了,但是有我回复他的,点进去他的主页还能给他评 盐水洗脸有何好处 中山市居民医疗保险 微信如何取消自动续费 - 知百科 怎么在电脑上不扫二维码登录 请问,我在网吧复制一个侠盗飞车,我打开游戏菜单找到侠盗飞车,打开鼠标... 网吧服务器用的是网维大师,有客户要玩侠盗飞车5(GTA5)。但是在网维大师... DISM什么是DISM 我想在网吧弄点游戏到自己家电脑 怎么弄啊 我想弄侠盗飞车5