python采用的是引用计数为主,标记-清除和分代回收两种机制为辅的策略。
引用计数:
每个对象维护一个(ob_ref)字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数加1,当引用失效时计数减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。(它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”)
标记-清除:
分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象).
分代回收:
Python将内存根据对象的存活时间划分三代,新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象。