Python 垃圾回收机制详解

作者:原创时间:2022-05-19
文档

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

也即采用“引用计数“为主(实时性,一旦没有引用,内存就直接释放了),“标记-清除”与“分代收集”两种机制为辅的策略。        

1. 引用计数

为每一个对象维护一个引用计数器,当一个对象的引用被创建或者复制时,(对象的引用)计数器+1,当一个对象的引用被销毁时,计数器的值-1,当计数器的值为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。

2. 标记-清除

“标记-清除”的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象,Python中的循环引用总是发生在容器container对象之间,也就是能够在内部持有其他对象的对象(比如:list、dict、class等)。这也使得该方法带来的开销只依赖于容器对象的数量。

原理:

将集合中对象的引用计数复制一份副本,用于找寻root object集合(该set中的对象是不能被回收的)。当成功找到root object集合,首先将现在的内存链表一分为二,一条链表维护root object集合,成为root链表;另外一条维护剩下的对象,成为unreachable链表。

一旦在标记的过程中,发现现在在unreachable链表且可能存在被root链表中直接或间接引用的对象,就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。

缺点:

该机制所带来的额外操作和需要回收的内存块成正比。

3. 分代回收

活的越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。

4. 其他

4.1 JNI(Java Native Interface)

提供了若干的API,实现Java与其他语言的通信。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注好二三四的更多内容!

显示全文
Python实现城市公交网络分析与可视化 Python数据分析处理(三)--运动员信息的分组与聚合 基于Python实现PDF区域文本提取工具 详解python的循环 python实现新年倒计时实例代码 Python实现消消乐小游戏 分享15个超级好用得Python实用技巧 学习python的while循环嵌套 提升Python运行速度的5个小技巧 Python按键或值对字典进行排序 图像检索之基于vlfeat实现SIFT特征 python绘图中的四个绘图技巧 js中toString方法3个作用 描写春天花朵的诗句 关于思念的诗句 带马字的诗句 牡丹花的诗句 想念的诗句 含雁的诗句 愁的诗句 关于树的诗句 缅怀亲人的诗句 春暖花开的诗句 家国情怀的诗句 含有星字的诗句 用来赞美老师的诗句 看破红尘的经典诗句 长江的诗句 关于传统节日的诗句 三月桃花的诗句 夕阳的诗句 纪念烈士的诗句 西湖的诗句 赞美虎的诗句 与莲有关的诗句 梅兰竹菊的诗句 描写山的诗句有哪些 描写植物的诗句 传统节日的诗句 咏雪的诗句