python垃圾回收机制
2020-08-25 本文已影响0人
_karen
基本机制
- 引用计数器为主、分代回收和标记清除为辅
1.引用计数器
1.双向环装链表refchain
在python中创建的任何对象都会放在refchain链表中,也就是说它保存着所有的对象。

**refchain会创建一些数据,源码中,PyObject和PyVarObject是基石,他们保存这其他数据类型公共部分,例如:每个类型的对象在创建时都有PyObject中的那4部分数据[上一个对象struct _object *_ob_prev;、下一个对象 struct _object *_ob_next、该对象的引用ob_refcnt、数据类型 *ob_type];list/set/tuple等由多个元素组成对象创建时都有PyVarObject中的那5部分数据[上一个对象struct _object *_ob_prev;、下一个对象 struct _object _ob_next、该对象的引用ob_refcnt、数据类型 ob_type、数据大小ob_size]。
1.2 引用计数器
引用计数器ob_refcnt:用来保存当前对象的引用计数器,顾名思义就是自己被引用的次数。当值被多次引用时候(比如 拷贝 赋值),不会在内存中重复创建数据,而是引用计数器+1 。 当对象被销毁时候同时会让引用计数器-1。
- 创建对象:
1.在双向循环列表refchain中,创建对象
2.将引用计数器ob_refcnt的值设置为1 - 删除对象
1.销毁对象,释放内存
2.引用计数器ob_refcnt-1
如果引用计数器为0,则将对象从refchain链表中摘除,同时在内存中进行销毁(暂不考虑缓存等特殊情况)。