Python 垃圾回收机制(GC)的简单复习

为什么要学习垃圾回收机制

不管学习什么样的编程语言,在执行代码的时候,总会占用系统内存去运行代码。在c,c++里管理内存的方式,是由用户自己管理的,用户可以任意申请内存,对于不懂得如何管理和释放垃圾(内存)的用户来说,无疑有造成大量内存泄漏的可能。在java、python这样对于一个字符串、列表、类甚至数值都是对象,且定位简单易用的语言,自然不会让用户去处理如何分配回收内存的问题。虽然这样让用户把更多的时间放在开发上,但对于面试来说,垃圾回收机制是必问的一道题,也是体现一个程序员核心素养的考察点,这里我们主要去复习一下python的垃圾回收机制。

垃圾回收(一)

1.小整数对象池

因为整数在python中使用非常频繁,为了优化速度,使用了小整数对象池,避免整数频繁的申请和销毁内存空间,Python 对小整数的定义是 [-5, 256](版本不同范围也有所改变)
不同变量指向这一范围的整数,不会申请内存,因为小整数对象池已经程序运行前创建好了

2.大整数对象池

除了小整数对象池以外的范围都称为大整数对象池,每次创建都会申请新的内存

3.intern机制(字符串驻留)

相同的字符串,只会创建申请一次内存,这样避免了字符串的复用导致的内存浪费

垃圾回收(二)

python有一套自己的内存分配系统,当我们在代码中创建一个对象时,python就会向内存申请一个空间来存储,属于即创即用的那种,此时这个对象也会保持一个引用计数,用来追踪到底有多少个引用指向了它,而当你不在使用这个对象时,也就是说引用计数为0的时候,python就像一个勤俭持家的好媳妇一样,将这个垃圾进行清理。

但是这个使用引用计数的方法只能处理较为简单的垃圾,一旦遇到循环引用(数据结构间相互引用)的时候就会很难搞,因为引用计数永远不可能为0,而默认的清理垃圾解决不了这种情况。

Python中的垃圾回收是以引用计数为主,分代收集为辅, 分代收集可以解决循环引用这个问题。

垃圾回收(三)

分代收集不是随随便便触发的,它需要一定的条件。每一次清扫垃圾之后python解释器会进行一次估计,阈值(创建的对象总数和被清理对象数的差值)超过一定范围时,会开启分代收集,用一条链子把剩下的对象串在一起,将引用计数减一判断是否为垃圾,将计数不为0的对象用第二条链子串在一起,计数为0的对象被视为垃圾回收,第二条链子也会进行清理,但是需要第一条链子清理次数达到一定条件,同理第三条链子也会出现,是当第条链子清理数量达到一定次数的时候,所以到第三条链子依然保留的对象一般就是程序中非常关键的对象啦(到第三条链子为止,不会出现第四条

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值