垃圾回收机制

垃圾回收机制

内存中的垃圾

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,所以这两个列表也不会被当成垃圾回收,会一直占用内存。

image

这就引出了以下的方法:
2.标记清除
'''专门针对循环引用问题'''
当内存占用到达临界值的时候,程序会自动停止,然后扫描程序中所有的数据,
并给只产生循环引用的数据打上标记,之后一次性清除
# 当然,标记清除要扫描程序中的数据,这一过程也要消耗内存。

3.分代回收
# 由于垃圾回收机制的频繁运行也会消耗内存资源,所以产生了分代回收的方法。

python把新创建的对象都会分配在 年轻代,年轻代的总数达到上限时,Python垃圾回收机制就会被触发,把那些可以被回收的对象被回收掉,而那些不会被回收的对象就会被移动到 中年代,依次类推, 老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期中。
年轻代内的数据值,垃圾回收机制会频繁检查,中年代中的数据,垃圾回收机制就会减少检查的次数,老年代就检查的更少。
posted @ 2022-09-27 16:06  passion2021  阅读(74)  评论(0编辑  收藏  举报