垃圾回收机制的疑问
这块老师并没有举例说明:
1、当Python运行时是如何记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数
2、“当两者的差值高于某个阈值时”这个阈值如何设置
我理解的是:
垃圾回收归为一句话“以引用计数为主,分代收集为辅”,如果一个对象的引用计数为0就一定会被回收这个对象的内存,可能会存在一次回收不完的情况,此时就开启分代回收,直至该对象完成被回收
如果我的理解正确,那么我想问什么节点下回触发进入分代回收呢
正在回答
同学你好:
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代链表。
如果我解决了同学的问题,请采纳!学习愉快^_^。
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星