| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 关于 Python 垃圾回收 -> 正文阅读 |
|
[Python知识库]关于 Python 垃圾回收 |
0.引言1.引用计数器1.1.环状双向链表 refchain1.2.类型封装结构体1.3.引用计数器1.4.循环引用问题2.标记清除3.分代回收4.小结5. 缓存机制5.1.池(int、字符串)5.2.free_list(float/list/tuple/dict)
0.引言最近一直对于python的垃圾回收机制有些疑惑,于是查了一些资料,看了一些大神的解析,总结了一下,供自己以后参考,避免忘记。 在b站学习了一下,这位大神 --????????凸头统治地球,【基于C语言源码剖析】python垃圾回收和内存管理??????? 1.引用计数器1.1.环状双向链表 refchain在Python程序中创建的任何对象都会被放在refchain链表中。
在C源码中如何体现每个对象中都有的相同的值:PyObject结构体(4个值)。 有多个元素组成的对象,PyObject结构体(4个值) + ob_size。 1.2.类型封装结构体
1.3.引用计数器
当python程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到refchain双线链表中。 在C源码中有两个关键的结构体:PyObject、PyVarObject。 每个对象中有ob_refcnt就是引用计数器,值默认为1,当有其他变量引用对象时,引用计数器就会变化。
1.4.循环引用问题
2.标记清除目的:是为了解决引用计数器循环引用的不足。 实现:在python的底层 再 维护一个链表,链表中专门放可能存在循环引用的对象(集合,元组,列表,字典)。 在python内部 问题:
3.分代回收将可能存在循环引用的对象维护成3个链表;
4.小结在python中维护了一个refchain的双向环状链表,这个链表中存储程序创建的所有对象,每中类型的对象中都有一个ob_refcnt引用计数器的值,引用个数+1,-1,最后当引用计数器变为0时会进行垃圾回收(对象销毁,refchain中移除)。 但是,在python中对于那些可以有多个元素组成的对象可能存在循环引用的问题,为了解决这个问题python又引用了标记清除和分代回收,在其内部维护4个链表。
在源码内部当达到各自的阈值时,会触发扫描链表进行标记清除的动作(有循环引用则各自-1)。 源码内部在桑树的流程中提出优化机制--缓存机制。 5. 缓存机制5.1.池(int、字符串)为了避免重复创建和销毁一些常见对象,引入维护池。
5.2.free_list(float/list/tuple/dict)当一个对象的引用计数器为0时,本应该回收,但内部不会直接回收,而是将对象添加到free_list链表中当缓存,以后再去创建对象时,不再重新开辟内存,而是直接使用free_list。
? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 3:48:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |