43.Python进阶_垃圾回收机制

引用计数机制为主,标记-清除和分代收集两种机制为辅的策略;
垃圾回收英文是 Garbage collection(GC), 当有人说GC的时候就要想到是垃圾回收。
垃圾回收机制主要的任务有以下:

  • 分配内存
  • 对象引用计数, 并识别没有引用的对象
  • 进行清除没有引用的对象

引用计数:

每个对象创建之后都有一个引用计数,当引用计数为0时候,那么此时的垃圾回收机制就会把它销毁,回收内存空间;

引用增加:
  1. 创建对象时候 ,a=1 创建 数字,字符串,实例对象 ,方法,类等引用 立马就增加+1
  2. 这个是引用的传递 ,a=b , 也就是 把b的 指针 传递给 a ,引用立马就增加1
  3. 参数的传递 也会增加 1 , 比如 def test(func) ,func 也可以是方法,类,实例对象等
  4. a=2 , b=[a] ,把a 放到列表里也会增加1
引用减小:
  1. 销毁对象 例如 del a
  2. 引用被转移了 , 例如 a= 1 变成 a=2
  3. 脱离作用域, 例如 在方法里的局部变量, 当运行完 会自动回收
  4. b=【a】 ,当删除 a 的时候 就减去1
引用计数的优点:

简单
实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数存在一个缺点,
  1. 维护引用计数消耗资源
  2. 那就是当两个对象出现循环引用时候,就不会销毁,会导致内存泄漏;
In [1]: li =[11]
In [2]: li2=[22]
In [4]: li.append(li2[0])
In [5]: li2.append(li[0])
In [6]: li
Out[6]: [11, 22]
In [7]: li2
Out[7]: [22, 11]
In [8]: del li
In [9]: del li2

在这里插入图片描述

2.标记清除

在这里插入图片描述 此方式主要用来处理循环引用的情况,
作用的对象是容器类型的对象(比如:list、set、dict等)。
原理是:通过根节点对象(不会被删除的对象)对有向图把所有活动对象打上标记,然后回收没有被标记的非活动对象。
标记清除算法是一种基于追踪回收技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。

3.分代回收

分代回收是建立在标记清除基础上的一种辅助回收容器对象的GC机制。 无论开发的程序类型如何,规模如何,都有这样的相同之处:一些比例的内存生存周期都很短,而另一些内存的生存周期比较长,可能会伴随着整个程序的开始和结束。 所以分代回收就根据系统中内存存活时间把它们划分成不同的集合:一共分成三个集合,每个集合称为一个代。 它们的垃圾收集频率 随 对象 存活存活时间的增大 而 减小。也就是说:对于存活时间越长的对象,就越不可能是垃圾,减少对其的收集频率。而新创建的对象都在第一代,第一代集合总数达到上限后,会触发GC机制:可以回收的对象所占的内存被释放,不能被回收的移到中年代。

有三种情况会触发垃圾回收:

  1. 调用gc.collect(),需要先导入gc模块。
  2. 当gc模块的计数器达到阀值的时候。
  3. 程序退出的时候。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值