python的内存回收机制
以引用计数为主,标记清除和分代回收为辅,分代回收是建立在标记清除之上。
引用计数:有一个ob_refcnt记录对象引用次数,当一个对象有新的引用时,值加1,当引用它的对象被删除时,值减一,当值为0时,这个对象的生命结束,启用垃圾回收机制回收该对象。
优点:简单,实时性高(只要计数为0就回收),回收内存的时间平摊到了平时。
缺点:为维护引用计数,消耗资源;循环引用,导致内存泄漏
标记清除:标记阶段,把所有活动对象打上标记,活动对象之间的引用关系构成边,最终构成一个有向图;清除阶段,从根节点出发,沿着有向边遍历整个图,不可到达的对象就是垃圾对象。
优点:解决了循环引用带来的问题
缺点:回收的频次需要控制,如果时时刻刻标记清除,那么python的程序慢成什么样子。
分代回收:建立在标记回收的基础上,是一种以空间换时间的方式。根据内存中对象的存活时间将他们分为3代,新生的对象放入到0代,如果一个对象在第0代回收垃圾中存活下来,将其放入到1代,如果在第1代的垃圾回收中存活下来,将其放入2代。
分代回收触发机制:有三个参数控制,可自行修改,一般不改。
三个参数的含义:当分配对象的个数减去释放对象的个数大于700时,产生一次0代回收;10次0代回收导致一次1代回收;10次1代回收导致一次2代回收。