总结python的内存回收机制

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中有零代,一代等,越小的代释放对象就越频繁。

你可能感兴趣的:(总结python的内存回收机制)