python的内存回收以引用计数为主,分代回收和标记清除为辅的回收策略。
引用计数
python中一切都是对象:
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
其中ob_refcnt就是该对象被引用的次数,每新增一个变量引用该对象,该值就增加1。
在python中有这么几种方式,主动的减少对象的引用计数:
1.del one_object.
2.若是列表或字典中的对象,从中除去它。
3.容器中的对象,可以del整个容器。缺点:
1.耗费空间去存储引用计数。
2.耗费时间去检查引用计数。
3.需要解决循环计数问题。
标记清除
为了解决循环计数而导致的内存泄漏,python搞了一种机制,是这么个意思:
因为最终肯定每个对象都要回收的,所以最后分配的计数值和释放掉的计数值要相等,但因为存在循环引用,所以它们的差会越来越大,当差大到某一个值后,python开始遍历“某一代”上的每一个对象,发现有循环引用的对象就将它们的引用计数减一,然后继续引用计数的回收策略。
分代回收
上面提到的某一代是指对象存在时间的“年代”,它是基于这种思想,存在时间越长的对象,程序就越需要它,而某些短暂生存的中间变量则要及时释放掉。
因此,Python中有零代,一代等,越小的代释放对象就越频繁。