python之垃圾回收机制

垃圾回收机制garbage collection

知识储备

我们在创建变量的时候,会申请内存空间,将变量内存地址和变量的值存储进去,在存储的时候,内存分为堆区和栈区,堆区存储变量的值,栈区存储的是变量名和变量值的内存地址
由于内存是有限的,所以应该定时对内存进行清理,将一些“垃圾及时的清理掉”

垃圾

上面我们理解了堆区和栈区,堆区的一个数据没有变量指向它的时候,我们就无法访问到他了,他也就变成了一个“垃圾”,我们应该将这些“垃圾”及时的清除掉,腾出空间

引用计数

垃圾回收机制的第一个方法是引用计数,对于堆区的数据,当其被引用一次,其身上的引用计数就增加1,比如说a=1,此时1这个数据的引用计数就是,当b=a=1时,1这个数据的引用计数就变成了2,当对堆区的一个数据的引用计数为0的时候(del a可以清除引用,使引用计数减一),该数据就会被清除,其占用的内存空间就会被收回

标记清除

# 循环引用
l1=[1]
l2=[2]
l1.append(l2)
l2.append(l1)
# 会产生下面的后果

循环引用
当我们将直接引用删除的时候,列表1和列表2的引用计数并不为0,但是实际上我们是无法从外部访问到他们的,也即是说,实际上他们也变成了垃圾,这时就需要标记清除
标记
标记的过程就是遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除
简单的说就是遍历所有的堆区中的内容,将那些没办法从栈区访问到的数据标记为非存活对象
清除
清除的过程将遍历堆中所有的对象,将没有标记存活的对象全部清除掉

分代回收

在标记的过程中,要历经多次扫描,这时,gc机制会认为多次扫描都没有被回收的变量是常用变量,根据变量的存活时间将变量进行分代
新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重加1,当变量的权重大于某个设定值,会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低
实际上分代回收提高的是回收机制的效率,是典型的空间换时间
缺点:
如果一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,该变量应该被回收,但青春代的扫描频率低于新生代,所以该变量的回收就会被延迟,他还会占用内存很长时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值