和java一样 python也有垃圾自动回收机制,但实现方法与java并不相同
python中以引用计数为主,零代为辅

1 引用计数机制

python里每一个东西都是对象,它们的核心就是一个结构体:PyObject

typedef struct_object {
    int ob_refcnt;
    struct_typeobject *ob_type;
} PyObject;

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
如果一个对象的引用数量降为0,会立即释放占用的内存

引用计数机制的优点:
- 简单
- 实时性 即一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

引用计数机制的缺点:
- 维护引用计数消耗资源,在对象内部保留一小部分空间用以存储引用数,同时在操作大量数据时不得不耗费精力处理每个对象的引用数
- 引用计数不能处理环形数据结构–也就是含有循环引用的数据结构。

第一个缺点在当前硬件条件下并不明显,但第二个在某些情况下却是致命危险,可能引起内存泄露,所以python又引入了标记清除和分代回收

2 孤立引用环

了解不多,日后填写

3 分代回收

也叫零代回收(Generation Zero)或隔代回收,基本思想是 大部分对象生命期很短,对年轻代和老年代使用不同的算法可以提高效率。 新创建出来的对象放在零代链表上,经过一段时间后gc检测零代链表中是否有循环引用,有则引用计数减1,当引用计数为0时释放内存,大于0且没有循环引用之后会将对象放入一代链表,再经过一段时间后检查一代放入三代。这就是新生代和老年代