Python垃圾回收

小整数对象池

范围[-5,256]

作用:凡是在该范围的数都是同一个对象,超出该范围的为创建的新对象

单个字符池

与小整数对象池一样,只有一个对象

intern机制

对于没有空格的字符串(两个字符以上),对象只会创建一次,创建完毕相当于放进字符串常量池,当要使用是会重该池拿对象出来使用

GC垃圾回收器

garbage collection

Python的对象分配

即创即向系统申请内存

垃圾回收机制

引用计数机制

每有一个引用指向对象时,对象的内部”引用计数器”加1,每当销毁一个引用时(del(a)),”引用计数器”减1,当其为0时,垃圾回收器立即回收内存(实时性)

零代(Generation Zero)

Python使用一种不同的链表来持续追踪活跃的对象

Python中的GC阈值

因为循环引用的原因,并且因为你的程序使用了一些比其他对象存在时间更长的对象,从而被分配对象的计数值与被释放对象的计数值之间的差异在逐渐增长。一旦这个差异累计超过某个阈值,则Python的收集机制就启动了,并且触发上边所说到的零代算法,释放“浮动的垃圾”,并且将剩下的对象移动到一代列表

一代

类似于0代

二代

类似于0代

处理分配

Python会相对更频繁处理0代,因为0代存储着新建的对象,往往这些新对象的生命周期相对于老对象更短(弱代假说(weak generational hypothesis)),老对象的存在拥有着一定的理由,我们不排除某些新对象有着重要的理由会在将来存在更久的时间,但是,这只是占小部分.

所以在第一道屏障里花大工夫,来将垃圾尽量在0代理处理掉.

gc实用模块

导致引用计数器+1情况

  1. 引用指向
  2. 作为函数参数
  3. 放进容器(如:list)

导致引用计数器-1情况

  1. 引用不在指向对象
  2. 对象离开其作用域(如执行完某一函数体)
  3. 从容器中删除对象,容器被销毁

查看对象的引用计数

import sys
sys.getrefcount(a)

关闭垃圾回收器

没人这么干,但是确实能这么干

import gc
gc.disable()

触发垃圾回收

  1. 调用gc.collect ()
  2. 当gc模块计数器达到阀值的时候
  3. 程序退出的时候

常用函数

gc.set_debug

设置debug模式,打印debug信息,通常设置gc.DEBUG_LEAK模式


gc.collect

垃圾回收检查

gc.collect(0),即检查0代对象的垃圾

gc.collect(1),即检查0、1代对象的垃圾

gc.collect(2),即检查0、1、2代对象的垃圾

如果不传参数,执行一个full collection,也就是等于传2

gc.set_threshold

设置阀值

gc.get_count

获取计数器

此处将初代作为0代,初代的后一代为1代,1代的后一代为2代

(1,2,3)

  1. 1代表距离上一次0代垃圾检查,”新建内存数-释放内存数”
  2. 2代表距离上一次1代垃圾检查,0代的检查垃圾检查次数
  3. 3代表距离上一次2代垃圾检查,1代的检查垃圾检查次数
上面的三个函数有什么联系?

阀值,是指计数器的阀值,当阀值达到上限的时候会触发垃圾回收检查,再去重置计数器.

当计数器从(699,3,0)增加到(700,3,0),gc模块就会执行gc.collect(0),即检查0代对象的垃圾,并重置计数器为(0,4,0)
当计数器从(699,9,0)增加到(700,9,0),gc模块就会执行gc.collect(1),即检查0、1代对象的垃圾,并重置计数器为(0,0,1)
当计数器从(699,9,9)增加到(700,9,9),gc模块就会执行gc.collect(2),即检查0、1、2代对象的垃圾,并重置计数器为(0,0,0)

collect后代每检查一次计数器都会重置上一代计数器的数值
如(50,1,2),
若collect(0),检查0代的垃圾对象,此时为(X,2,2)
若collect(1),检查0,1代的垃圾对象,此时为(X,0,3)
若collect(2),检查0,1,2代的垃圾对象,此时(X,0,0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值