本文主要介绍python中循环引用和标签清除的问题分析。很详细,有一定的参考价值。感兴趣的朋友一定要看完!
=
00-1010循环引用:的危险将导致内存溢出,因为循环引用计数不能为零。
解决方案:
标记
1 在循环引用的情况下,引用计数就不好事了,这时候就需要用到标记清除
。引用计数加1一次,值减为0后应该回收,所以这里有一个问题。
Cpython的垃圾收集机制不是一直运行,而是每隔一段时间运行一次,所以会出现效率问题。
为了保证效率,cpython采用了代回收,提高了效率。
子恢复:
1老年常用数据:
旧扫描(比如每小时扫描一次)的频率可能比较低,有些旧数据可能还在使用,所以扫描的频率比较低。
2年轻一代数据:名新生
扫描年轻频带的频率(例如,每5分钟一次)可能相对较高,
因为有些新数据一生成就可能被丢弃,这样内存空间
2 关于标记清除的效率问题(低)
就可以及时清理。首先来说说变量:的概念。
1变量名:没有值,只是指向一个内存地址。
2分配符号
3变量值:这是存储数据的地方。
变量存储在内存中,变量名存储在堆栈中,变量值存储在堆中。
我们只能操作堆,也就是变量值,而不能操作变量名的存储位置。
例如:x=1
x=2
X最终等于2,因为X指向的内存地址发生了变化。
我们都通过变量名来访问值,并且会有一个标记过程。堆栈区域中存在的对象称为GCRoots对象。
它会扫描栈区(变量名)中的所有内容,将栈区中所有对象直接或间接访问的对象标记为活动对象,其余为非活动对象,应清除。
例如,l1=[1]
l2=[2]
l1 .追加(l2)
l2 .追加(l1)
dell1
戴尔2
GCRoots的可访问对象是什么?可以通过堆栈区域(变量名)到达(访问)的对象称为GCRoots可达对象。
l1是一个GCRoots,del从指向的内存地址解除l1的绑定,L1没有引用计数。以上就是《python中循环引用和标记清除的分析》一文的全部内容。感谢阅读!希望分享的内容对大家有所帮助。更多相关知识,请关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/93187.html