python 的内存管理机制是引用计数器为主,标记清除和分代回收为辅 + 缓存机制。
环状双向链表 refchain
在 python 中创建的任何一个对象都会放在 refchain 中。
当创建一个对象,比如
1  | name = "123"  | 
会同时创建
- 上一个对象
 - 下一个对象
- 链表结构
 
 - 类型
 - 引用个数
 
当然,根据类型的不同,具体的存储也有一点不同,比如,对于 数组来说,会增加
- items 属性
 - 元素个数
 
对于 int 或者其他来说,会增加
value属性
C 语言源码
1  | 
  | 
对于不同的类型,会创建不同的结构体
float 类型
1  | typedef struct{  | 
data = 3.14会创建_ob_next = refchain下一个对象_ob_prev = refchain上一个对象ob_refcnt = 1ob_type = floatob_fval = 3.14
其他类型会有自己的结构体。
当 python 程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体的字段来进行创建相关的数据,然后将对象添加到 refchain 双向链表中。
在 C 源码中有两个关键结构体
- PyObject
 - PyVarObject
 
引用计数器
对象中的 ob_refcnt 就是引用计数器,值默认为 1。当有其他变量引用的时候,引用计数器会发生变化。
1  | a = 999 # ob_refcnt = 1  | 
当引用计数器为 0 时,无对象使用,则会进行垃圾回收。