Skip to content

Python 的内存管理和垃圾回收机制

Tip

引用计数器为主,标记清除和分代回收为辅 + 缓存机制

1 引用计数器

1.1 环状双向链表 refchain

static PyObject refchain = {&refchain, &refchain};

在 Python 程序中,创建的任何对象,都会放在 refchain 链表中。获得了 refchain,相当于获得了所有的对象

一旦执行程序实例化一个对象,内部则会创建一些通用的数据 —— 【上一个对象、下一个对象、类型、引用个数】,以及针对不同数据类型,添加特殊的部分。

name = "BYA" # 【上一个对象、下一个对象、类型、引用个数、val=】
age = 100
hobby = ["Movie", "Tennis"]

1.2 类型封装结构体

1.3 引用计数器

当 python 程序运行时,会根据数据类型的不同找到对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到 refchain 双向链表中。

在 C 源码中,有两个关键的结构体:PyObject 和 PyVarObject

每个对象中,ob_refcnt 就是引用计数器,值默认为1,当有其他变量引用对象时,引用计数器就会发生变化。

  • 引用

  • 删除引用

Attention

当一个对象的引用计数器为 0 时,意味着没有人再使用这个对象了,这个对象就是垃圾,Python 会进行垃圾回收。

回收:1. 对象从 refchain 链表移除; 2. 将对象销毁、内存归还

2 标记清除

3 分代回收

4 缓存机制

5 Python 的 C 源码(3.8.2版本)