垃圾回收机制
垃圾回收机制
内存中的垃圾
a = 1 # 在内存中会生成 1
del a # 删除变量名a后,我们无法再取出内存中的 1 # 这个1 就成为了内存中的垃圾
有一些语言 内存空间的申请和释放都需要程序员自己写代码才可以完成。
在python中使用垃圾回收机制清理内存垃圾。
回收的方法
1.引用计数
name = 'oshio' # name可以访问内存中的oshio 此时计'oshio'身上的引用计数为1
name1 = name # 数据值'oshio'的引用计数为2 因为现在name1也可以访问他俩
del name1 # 删除变量名name1 现在'oshio'身上的引用技术为1
当数据值上的引用计数为0时,就会被垃圾回收机制当做垃圾回收掉 。
不为0则,不会回收。
'''循环引用问题'''
a = [1, 2] # a列表引用计数为1
b = [3, 4] # b列表引用计数为1
a.append(b) # a = [1,2,b列表] # 此时b列表引用计数为2
b.append(b) # b = [3,4,a列表] # 此时a列表引用计数为2
此时即使我们将变量名删除:
del a
del b
内存中的列表,仍然在相互引用,也就是引用计数恒为1,所以这两个列表也不会被当成垃圾回收,会一直占用内存。
这就引出了以下的方法:
2.标记清除
'''专门针对循环引用问题'''
当内存占用到达临界值的时候,程序会自动停止,然后扫描程序中所有的数据,
并给只产生循环引用的数据打上标记,之后一次性清除
# 当然,标记清除要扫描程序中的数据,这一过程也要消耗内存。
3.分代回收
# 由于垃圾回收机制的频繁运行也会消耗内存资源,所以产生了分代回收的方法。
python把新创建的对象都会分配在 年轻代,年轻代的总数达到上限时,Python垃圾回收机制就会被触发,把那些可以被回收的对象被回收掉,而那些不会被回收的对象就会被移动到 中年代,依次类推, 老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期中。
年轻代内的数据值,垃圾回收机制会频繁检查,中年代中的数据,垃圾回收机制就会减少检查的次数,老年代就检查的更少。