详解Python垃圾回收机制
引入为什么要有垃圾回收机制 Python中的垃圾回收机制简称( >>> name = "yunya" #yunya 准备改名 >>> name = yunyaya原本yunya这个名字不使用了,现在必须清理掉它否则将会占据内存空间,所幸Python的垃圾回收机制会帮我清理掉 "yunya" >> 堆区和栈区的概念如果你看我之前写的那篇文章关于Python变量的底层原理的话那么想必对堆区和栈区内存有了一定的了解。如果没有看过那么也没有关系,链接如下:
底层工作原理引用计数引用计数说白了就是来对堆区的变量值绑定的栈区变量名来计数。如图: 当使用 那么这里就是Python内存回收机制中最基本的也最常用的引用计数介绍。 循环引用-内存泄漏引用计数虽然作为Python内存回收机制中最经常使用的一种机制,但是它本身也是具有一定的缺点。我们来看下面这段代码: >>> l1 = [1,2,3] >>> l2 = [1,1)">,l1] >>> l1.append(l2) append()方法用于向列表中添加一个元素值 >>> l1 [1,3,[1,[...]]] >>> l2 [1,[...]]] >>> 现在
>>> del l1 >>> l2 >>> 现在怎么访问 li1 或者 li2 呢?访问不到,但是他们的变量值依然存在于内存,引用计数从2变为1 标记-清除标记清除的意思在于当应用程序可用内存空间即将被耗尽时便开始扫描栈区,并且会顺着栈区变量名对堆区中的变量值做一个标记,如果堆区中存在没有与栈区变量名做对应关系的数据则会被认为是垃圾数据从而被Python垃圾回收机制清理。 效率问题解决方案-分代回收基于引用计数的垃圾回收机制每一次执行清理操作前都会将整个堆区的变量值的引用计数做一次遍历统计。这样做是非常消耗时间的,所以Python垃圾回收机制为了效率的提升加入了分代回收的策略。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |