老猿理解的Python中的垃圾回收机制

垃圾回收机制(GC)是所有高级语言的标准配置之一。在一定程度上可以优化编程语言的数据处理效率,提高编程软件开发软件的安全性能。Python中的垃圾回收机制主要基于引用计数,并辅以令牌删除和生成收集。自动管理内存中的无效数据!

以下是三者之间的区别:

1. 引用计数

Python默认的垃圾收集机制是引用计数,这是一种由George E. Collins在1960年首次提出的算法,近60年后仍被许多编程语言使用。

引用计数的核心原理是:每个对象保持一个ob_ref字段,用来记录当前被引用对象的个数,每当新的引用点指向该对象时,引用计数ob_ref加1,每当对象引用失败计数ob_ref减1,一旦对象引用计数为零,该对象立即被回收,对象占用的内存空间将被释放。

引用计数有明显的优点:

效率高,实时性好,可以在最短的时间内获得并计算对象引用的次数,对象具有一定的生命周期,操作简单,易于实现。

引用计数也有明显的缺点:

  • 维护引用计数消耗资源,维护引用计数的次数与引用分配成正比,这与Mark和Sweep不同,后者基本上与回收的内存数量有关。
  • 循环引用问题无法解决。A和B彼此引用,但没有对A和B的任何外部引用,两者的引用计数都是1,但显然应该被回收。

为了解决这两个致命弱点,Python引入了以下两种GC机制。

2. 标记和清除

标记清除算法是一种基于跟踪GC技术的垃圾收集算法。它主要是一种对可能产生循环引用的对象的检测机制。它分为两个阶段:标记阶段,GC标记所有“活动对象”;第二个阶段,回收未标记的“不活动对象”。

那么GC如何确定哪些对象是活动的,哪些是不活动的呢?

对象通过引用(指针)连接,形成有向图。对象构成有向图的节点,引用关系构成有向图的边。从根对象开始,沿有向边遍历对象。可达对象被标记为活动对象,不可达对象被标记为要删除的非活动对象。根对象是全局变量、调用堆栈和寄存器。

3.分代垃圾回收

分代采集是基于标记去除技术,是一种空间交换时间的操作方式。Python内存根据对象的生存时间分为不同的集合,每一个集合称为一代,Python内存可以分为三个“代”,分别在较年轻的一代(0)、s(1)、s(2)中,它们是对应的三个列表,它们的垃圾回收频率和对象随着生存时间的增加而减少。

新创建的对象被分配给年轻代。当年轻代列表总数达到上限时,触发Python垃圾收集来收集可收集的对象,不能收集的对象被移到中代,以此类推。老一代中的对象是存活时间最长的对象。甚至在整个系统的生命周期内。

posted @ 2022-10-02 15:20  老猿一只  阅读(65)  评论(0编辑  收藏  举报
超越台 网站制作 软件开发