day04-垃圾回收机制

1什么是垃圾回收机制
是python解释器启动后自带的内存管理方法
2.为什么要有垃圾回收机制
当程序在运行时,设计到赋值变量的时候,会申请很多内存空间,随着程序的运行,变量所占的
内存就越来越大,而gc这个时候起到了释放内存的作用
3.运行的原理
3.1 引用计数是gc的主要原则,分为直接引用和间接应用
直接引用:
a=1
print(id(a))

间接应用:
a=1
list_1=['x','y',a]
print(id(list_1[2]))
------
a=1
dict_1={'x':1,'y':a}
print(id(dict_1['y']))
重新给a赋值,在容器中a的值的内存地址不会改变

3.2 标记清除:用于解决循环引用产生的内存泄漏
l1=[1,]
l2=[2,]

l1.append(l2) l1=['值1的内存地址','列表l2内存地址']
l2.append(l1) l2=['值2的内存地址','列表l1内存地址']

del l1
del l2
两个列表的内存地址分别与变量名l1、l2解除绑定,即栈区变量名于堆区的值之间没有任何的
直接引用,但两个列表再堆区还在进行循环引用,会引起内存泄漏,python会用标记清除的办法将
两个列表的内存清理掉

3.3 分代回收(copy)
分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,
gc对其扫描的频率会降低,具体实现原理如下:
代指的是根据存活时间来为变量划分不同等级(也就是不同的代)
新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,
那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),
会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),
假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,
青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,
被垃圾回收机制扫描的频率越低
上一篇:day04-3字典


下一篇:day04垃圾回收机制