【Python垃圾回收机制】

大数据时代,跟数据打交道亦是对数据进行存储、处理等操作。
对数据进行处理的同时,将数据存储在内存,后续持久化到硬盘的过程中,也会产生相应的垃圾数据。
1)对于面向过程开发的语言来讲,如C、C++,使用此类语言进行开发的同时要兼顾内存的管理及维护;自己管理内存自由不受外界因素干扰,任意去申请计算机中的内存,但是不及时处理申请后的内存可能会造成内存泄漏、悬空指针等bug隐患;
2)对于面向对象开发的高级语言来讲,如Java、C#、Python等,他们只需要去关注内存中存储对象时申请的内存即可;开发语言往往会有自己的一套解决方案去处理申请内存后的问题,通常我们将其称为垃圾回收机制。拿Python举例,Python的垃圾回收机制采用的是以引用计数机制为主,标记-清除分代收集为辅的策略。

  • 引用计数
    引用计数算法在每个对象都维护着一个内存字段来统计它被多少”部分”使用—引用计数器,每当有一个新的引用指向该对象时,引用计数器就+1 ,每当指向该引用对象失效时该计数器就-1 ,当引用数量为0的时候,则说明对象没有被任何引用指向,可以认定是”垃圾”对象。
    • 用Ruby和Python作比较
      • Ruby
        Ruby是一种面向对象程序设计的脚本语言。
        引用声明对象时,Ruby会向其可用列表申请存储空间,可用列表(链表)是预先存在的,每需要就向链表中的无对象的存储空间创建一个对象,这就好比青年公寓,一间房间有8个床位,从一开始的0人,每来一位租客就占用一个床位。但是Ruby存在的问题就是当租客A从床位1搬到床位8,床位1并不会收拾干净,这样新租客就无法去使用该床位1,所以可用空间越来越少,造成了不合理的内存管理现象。
      • Python
        Python在使用引用计数机制来声明对象时,避免了人走床占的现象,每申请一个空间存储对象则标记为1,当其他对象也指向该已占空间时,将标记为1的空间计数加1记为2,以此类推;又或是当已指向一空间的对象指向其他存储地址时,将其标记为1的空间记为0,指向其他的空间地址计数加1,随后释放计数为0的空间内存。
    • 标记-清除
      • Ruby
        当可用列表的可用空间越来越少,则需要Ruby停止工作来专门处理人走床占的情况,轮询所有指针,遍历所有指向空间,将人走床占的空间当成垃圾进行处理,将这些垃圾对象重新送回到可用列表中,生成新的可用列表。可以理解经过一段周期定时去清理房间,将垃圾对象占用的空间通过指针调整指向新链表以备用。
      • Python
        当出现了相互引用的情况,存储对象的空间始终不会释放内存;即数据结构为循环数据结构该如何处理?举例说明,假如内存中两个存储对象空间分别存入A、B,A.append(B),B.append(A)
        这时构造了相互引用的场景,python为了解决其情况带来的问题,将A、B两对象内部分别存储一个单独的属性,这是A append B 即等价于 B -> A (单向链表) ,B append A 即等价于 A -> B(单项链表),两者构成了双向链表,一旦形成链表结构,单独属性就有了具体值。当我们不在使用该对象时,单独属性就会将具体值置为None,其引用对象的引用计数值也会减1。
        (attention:虽能解决循环引用数据的存储问题达到垃圾及时回收效果,但是需要拿出一部分内存来处理,这就造成了一定的资源浪费)
    • 分代收集
      Python中的GC阈值
      随着程序运行,Python解释器保持着新对象的创建,以及对上一对象的追踪,从理论上来说,这两者值应该保存一致。因为每个程序中新建对象最终都应该被释放。
      由于循环引用的原因,一个对象可能被长期使用,随着代码持续访问的对象,会从零代转移到一代在转移到二代。通过不用的阈值设置,python可以在不同的时间周期去处理这些对象,处理零代最为频繁,其次是一代然后才是二代。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值