Python 的内存管理和垃圾回收机制¶
Tip
引用计数器为主,标记清除和分代回收为辅 + 缓存机制
1 引用计数器¶
1.1 环状双向链表 refchain¶
static PyObject refchain = {&refchain, &refchain};
在 Python 程序中,创建的任何对象,都会放在 refchain 链表中。获得了 refchain,相当于获得了所有的对象
一旦执行程序实例化一个对象,内部则会创建一些通用的数据 —— 【上一个对象、下一个对象、类型、引用个数】,以及针对不同数据类型,添加特殊的部分。
1.2 类型封装结构体¶
1.3 引用计数器¶
当 python 程序运行时,会根据数据类型的不同找到对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到 refchain 双向链表中。
在 C 源码中,有两个关键的结构体:PyObject 和 PyVarObject
每个对象中,ob_refcnt 就是引用计数器,值默认为1,当有其他变量引用对象时,引用计数器就会发生变化。
-
引用
-
删除引用
Attention
当一个对象的引用计数器为 0 时,意味着没有人再使用这个对象了,这个对象就是垃圾,Python 会进行垃圾回收。
回收:1. 对象从 refchain 链表移除; 2. 将对象销毁、内存归还