引进
为什么需要垃圾回收机制
Python垃圾回收机制的简称(GC )在程序运行时生成大量变量并存储数据,但某些变量已被占用,因此可能需要清理并释放该变量占用的内存空间。 在低级语言(例如,c语言、汇编语言)中,内存空间的释放需要编程人员手动完成,与这种底层硬件直接交互的工作非常危险和繁琐,而基于c语言开发的Python则消除了这一担忧
name='yunya' #yunya准备改名
name='yunyaya' #原来不用yunya这个名字,现在必须打扫。 否则会占用内存空间。 幸运的是,Python的垃圾回收机构会帮我清理“云雅”
堆和堆栈概念
如果你看了我以前写的文章,知道了Python变量的基础原理,你就会对堆区域和堆栈区域的内存有一定程度的了解。 如果没见过的话就没关系。 链接如下。
Python变量和基本数据类型
基本工作原理
引用数
引用计数简言之是对绑定到堆变量值的堆栈变量名称进行计数。 图:
使用del或重新赋值给变量名称时,变量值的引用数为-1。 如果引用计数为0,则下次使用Python内存回收机制进行内存扫描时,变量值将作为垃圾回收。
本节介绍Python内存回收机制中最基本、最常用的引用计数。
循环引用-内存泄漏
引用计数是Python存储器回收机制中最常用的机制之一,但其本身也有缺点。 看看下面的代码。
L1=[ 1,2,3 ]
L2=[ 1,2,3,l1]
L1.append(L2 ) #append )方法用于向列表中添加元素值
l1
[ 1,2,3,[ 1,2,3,[.]]]
二级方程式
[ 1,2,3,[ 1,2,3,[.]]]
现在l1和l2都被用作交叉引用。 那么,这种引用方法称为循环引用,循环引用会带来问题。
l1变量值的引用计数当前为2
l2变量值的引用计数当前为2
使用戴尔L1和戴尔L2后?
这些参照变量都减去1,但参照方式的变量名相互删除,逻辑上这些变量值都是垃圾变量。 光靠引用计数是无法清理这些垃圾变量的。
戴尔L1
戴尔L2
#现在怎么访问li1或li2? 无法访问,但他们的变量值仍然存在于内存中,引用数从2变为1
标记-清除
清除标志意味着在APP应用程序的可用内存空间即将用完之前开始扫描堆栈区域,并根据堆栈区域的变量名称标记堆栈区域中的变量值。 如果堆栈区域中存在与堆栈区域变量名称不对应的数据,则会将其视为垃圾数据,并由Python垃圾回收机制进行清理。
高效解决问题-分代回收
基于引用计数的垃圾回收机制在每次执行清理操作时都会遍历整个堆中变量值的引用计数。 这样做非常耗时,因此Python的垃圾回收机制为提高效率推出了分代回收策略。
参考文献
33559 www.jb51.net/article/161474.htm
以上是对Python垃圾回收机制的详细分析,有关Python垃圾回收机制的资料请关注聚美学院其他相关文章。