内存管理机制/垃圾回收机制:
原创
©著作权归作者所有:来自51CTO博客作者wx63a427ac86e31的原创作品,请联系作者获取转载授权,否则将追究法律责任
内存管理机制(垃圾回收机制)
#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;
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个链表).