Python中的垃圾回收机制

Python的垃圾回收机制 引子:

我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被Python解释的垃圾回收机制自动回收。。。

一、什么是垃圾回收机制?

垃圾回收机制(简称GC)是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间

二、为什么要用垃圾回收机制?

程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

三、垃圾回收机制原理分析

Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。

1、什么是引用计数?

引用计数就是:变量值被变量名关联的次数

如:name=‘jason'

变量值jason被关联了一个name,称之为引用计数为1

引用计数增加:

x=10 (此时,变量值10的引用计数为1)

y=x (此时,把x的内存地址给了y,此时,x,y都关联了10,所以变量值10的引用计数为2)

引用计数减少:

x=3(此时,x与10解除了关联,与3 建立了关联,变量10的引用计数为1)

del y(del的意思是解除变量名y与变量值10的关联关系,此时,变量10的引用计数为0)

这样变量值10的引用计数为0,其占用的内存地址就会被回收

2、引用计数扩展阅读?(折叠)

引用计数机制执行效率问题:变量值被关联次数的增加或减少,都会引发引用计数机制的执行,这存在明显的效率问题 如果说执行效率还仅仅是引用计数机制的一个软肋的话,那么很不幸,引用计数机制还存在着一个致命的弱点,即循环引用(也称交叉引用)。

# 变量名l1指向列表1,变量名l2指向列表2,如下 >>> l1=['列表1中的第一个元素'] # 列表1被引用一次 >>> l2=['列表2中的第一个元素'] # 列表2被引用一次 >>> l1.append(l2) # 把列表2追加到l1中作为第二个元素,列表2的引用计数为2 >>> l2.append(l1) # 把列表1追加到l2中作为第二个元素,列表1的引用计数为2 # l1与l2 # l1 = ['列表1中的第一个元素',列表2的内存地址] # l2 = ['列表2中的第一个元素',列表1的内存地址]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzjws.html