内存管理机制(垃圾回收机制)
- 对象分类:
- 定长: int / float
#define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev; ? typedef struct _object { _PyObject_HEAD_EXTRA // 用于构造双向链表 Py_ssize_t ob_refcnt; // 引用计数器 struct _typeobject *ob_type; // 类型 } PyObject;
- 多个元素组成: str/list/dict/set/tuple
typedef struct { PyObject ob_base; Py_ssize_t ob_size; /* Number of items in variable part */ } PyVarObject;
- 定长: int / float
- 内存管理机制
- 引用计数器为主
def func(): ? 每次创建对象,会在内存中开辟空间,引用计数器默认为1; a = 123 ? 在创建一个变量指向原来a开辟的内存,引用计数 +1; b = a ? func() ? 当引用计数器为0,则表示它时垃圾,可以进行回收.
- 循环引用的问题
当Python中对于 str/list/dict/set/tuple 类创建对象时,会将对象放到一个双向链表中. a = "asdf" b = [11,22] c = {‘k1‘:123} ? 如果链表中达到700个对象,会对双向链表中的所有元素进行扫描. 如果有循环引用,则两个都-1,最后扫描完毕,将链表中的所有元素一分为二: 1. 引用计数器为0的对象, 回收. 2. 引用计数器不为0的对象,就将它放到另外一个双向链表中(总共有3个链表).
- 引用计数器为主
原文地址:https://www.cnblogs.com/zhang-da/p/12005111.html
时间: 2024-11-12 01:49:01