【Python垃圾回收机制】

您所在的位置:网站首页 python垃圾处理机制 【Python垃圾回收机制】

【Python垃圾回收机制】

2023-06-22 03:59| 来源: 网络整理| 查看: 265

大数据时代,跟数据打交道亦是对数据进行存储、处理等操作。 对数据进行处理的同时,将数据存储在内存,后续持久化到硬盘的过程中,也会产生相应的垃圾数据。 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可以在不同的时间周期去处理这些对象,处理零代最为频繁,其次是一代然后才是二代。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3