day05学习笔记-垃圾回收机制

一、引入

  解释器在执行到定义变更的语法时,会申请内存空间来存放变量,但是内存空间的容量有限,如何处理所占用内存空间的回收问题,当这个变量值没有用了(简称垃圾)就应该回收掉了。

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

  垃圾回收机制(简称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、分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率

猜你喜欢

转载自www.cnblogs.com/xiao-zang/p/12420802.html
今日推荐