一、引入
解释器在执行到定义变更的语法时,会申请内存空间来存放变量,但是内存空间的容量有限,如何处理所占用内存空间的回收问题,当这个变量值没有用了(简称垃圾)就应该回收掉了。
二、什么是垃圾回收机制?
垃圾回收机制(简称GC),是python解释器自带的一种机制,专门用来回收不可有的变量值所占用的内家间
三、为什么要用垃圾回收机制?
因为程序在运行过程中会申请大师的内存空间,而对于没有用的内存空间的占用,会导致程序内存溢出,程序崩溃,所以需要定时的清理这些没有用的垃圾,翻译内存,缓解计算机的压力
这个原理比较难,详见链接:(借用下egon老师的博客)
https://www.cnblogs.com/xiaoyuanqujing/articles/11640905.html
1、引用计数
x = 10 # 直接引用
print(id(x))
y = x
z = x
l = ['a', 'b', x] # 间接引用
print(id(l[2])) #
d = {'mmm': x} # 间接引用
print(id(d['mmm']))
x=10
l=['a','b',x] # l=['a'的内存地址,'b'的内存地址,10的内存地址]
x=123
print(l[2])
x=10
x=[10,]
l=['a','b',10]
以上例子中讲解了,直接引用与间接引用,间接引用说到底也是需要靠直接引用的。
所以若是把某一个变量值的直接引用全部解绑了的话,有多少间接引用,也无法调用了,也就是垃圾了,就会回收了。
垃圾回收机制的是python解释器自己自动处理的,在内存不够的时候自动处理掉这些垃圾,以释放内存。
2、标记清除:用来解决循环引用带来的内存泄露问题
循环引用=>导致内存泄露
l1=[111,]
l2=[222,]
l1.append(l2) # l1=[值111的内存地址,l2列表的内存地址]
l2.append(l1) # l2=[值222的内存地址,l1列表的内存地址]
print(id(l1[1]))
print(id(l2))
print(id(l2[1]))
print(id(l1))
print(l2)
print(l1[1])
del l1
del l2
这上面的例了讲了下l1与l2的互相引用,你中有我,我中有你,正是因为有可能有这种现象的出现才会有垃圾产生,而无法回收,
所以有了新的方法,标记清除来解决这个问题
3、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率