哪位老师介绍下 垃圾回收执行流程

哪位老师介绍下 垃圾回收执行流程

您好,视频中完全没提过标记清除 这个机制
只说了引用计数和分代回收
没有提互相引用的对象 在回收机制中是如何释放内存的
分代回收机制是为了提高效率是吧 对于有引用的对象不断降低 判断它是否回收的 频率 是这么理解吧?
能介绍下python中垃圾回收的机制的执行流程么?从引用计数 到标记 还有 分代 。
我还有看见有个人写了个死亡容器和存活容器的概念,这个也麻烦介绍下。

麻烦逐条解答下 谢谢

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好:

同学可以这么理解。

1、

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数法的原理是每个对象维护一个ob_refcnt,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。当引用计数为0时,该对象生命就结束了

2

阈值分析:

700即是垃圾回收启动的阈值;

每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收;

何为分代回收

  Python将所有的对象分为0,1,2三代;

  所有的新建对象都是0代对象;

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

 

 gc.set_threshold()  # 设置Python垃圾回收的阈值

比如提高第一代的扫描阈值(1000),对2代对象进行更频繁的扫描(5个1代就有一次2代)。

        import gc

        gc.set_threshold(1000, 10, 5)


3 分代回收是python会自动循环回收的过程,当满足0代对象阈值后会进行1代对象的回收,满足1代后则会回收2代。

python在创建对象之前,会创建一个链表,零代链表,只不过这个链表是空的。每当你创建一个对象,python便会将其加入到零代链表。

python隔代回收的核心:对链子上的那些明明没有被引用但引用计数却不是0的对象进行引用计数减去一,看看你是不是垃圾。如果被引用多次减去一之后仍不为零,那么会在0代链表当中继续被清理,直至引用计数为零。因为如果没有变量指向它,或者作为函数的参数,列表的元素等等,那么它就始终是0代链表中被清理的对象。当0代链表被清理达到一定次数时,会清理1代链表。1代链表被清理达到一定次数时,会清理2代链表。

因此清理的频率最高的是0代链表,其次是1代链表,再是2代链表。

死亡容器、存活容器:

删除第一步:对执行删除操作后的每个引用-1,当对象的引用为0,把他们都放到死亡容器内。把那些引用仍然大于0的放到存活容器内。

删除第二步:遍历存活容器,查看是否有的存活容器引用了死亡容器内的对象,如果有就把该对象(注意是对象,比如0x7f94bb602f80,不是对象的引用)从死亡容器内取出,放到存活容器内。
当对象都没有变量引用他们了,所以经过这一步骤,他们还是在死亡组。

标记删除第三部:将死亡组所有对象删除。

如果我解决了同学的问题,请采纳!学习愉快^_^。


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师