python基础-垃圾回收机制

1. (主)引用计数(reference counting)

引用计数为0时,该对象生命就结束了。维护引用计数消耗资源,循环引用L.append(L) L一直不回收

2.(辅)标记清除机制(mark and sweep)

2.1 目的:

解决容器对象的循环引用

2.2标记清除原理:

对象之间会通过引用连接在一起,构成一个有向图。对象构成有向图的节点,而引用关系构成有向图的边。从root object出发,沿着有向边遍历对象,可达的对象标记为活动对象,不可达的对象就是要被清除的非活动对象。这里解释一下root object,它指的其实就是一些全局变量、调用栈、寄存器,这些对象时不可删除的。

如上图所示,我们把黑圈视为root object。从其出发,对象1可达,那么它将会被标记,对象2和3间接可达也会被标记,而4和5不可达。那么1、2、3就是活动对象,4和5就是非活动对象而被GC回收。

参考:https://juejin.cn/post/7064595867852308494

3. (辅)分代计数

将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

4. 总结:

Python的GC模块主要运用了“引用计数”来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”解决容器对象可能产生的循环引用的问题。通过“分代回收”以空间换取时间来进一步提高垃圾回收的效率。

posted @ 2022-08-25 17:13  aleiyoy  阅读(30)  评论(0编辑  收藏  举报