1、垃圾回收机制详解(了解)
什么是垃圾回收机制?
垃圾回收机制时python解释器自带的一种机制专门用来回收不可用变量值所占的内存空间
为什么要有垃圾回收机制?
程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会 导致内存使用殆尽(内存溢出), 导致程
序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器 自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。
垃圾回收机制原理分析:
引用计数 :变量值被变量名关联的次数,引用技术为0的变量值称为“垃圾”
直接引用:x = 10
y = x(引用计数增加)
间接引用:d = {'mmm': x}
标记清除 :用来解决循环引用带来的内存泄露问题(列表的循环引用会产生引用计数不为0的‘垃圾’) 循环引用=>导致内存泄露
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
标记
标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有
GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。
清除 清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
分代回收 :用来降低引用计数的扫描频率,提升垃圾回收的效率。
分代指的是根据存活时间来为变量划分不同等级(也就是不同的代)
新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,
那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),
会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),
假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,
接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低