Python采用的是引用计数为主,标记-删除、分代收集为辅的策略
三种机制的作用:
*引用计数机制:用来跟踪和回收垃圾
*标记-清除 :用来解决容器对象可能产生的循环引用问题
*分代收集 :用空间换时间的方法提高回收效率
引用计数机制: reference count
PyObject是每个对象必有的内容,ob_refcnt就是作为引用计数。当对象有新的引用时+1,引用的对象被删除-1,当ob_refcnt为0时,对象的生命结束。
引用计数机制 无法处理循环引用导致内存泄漏
(内存泄漏:由于疏忽或错误导致程序未能释放已经不再使用的内存的情况,造成内存的浪费,导致程序运行速度减慢甚至系统奔溃。)
**标记清除机制:**按需分配,等到没有空闲内存的时候,从寄存器和程序栈的引用出发,遍历以对象为节点,以引用为边构成的图,把所有可以访问的到的对象打上标记,然后把所有没有标记的对象释放。
分代回收机制:
对象存活时间越长,认为该对象越不可能是垃圾,收集的频率越低。
将内存根据对象存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为3代,0年轻代、1中年代、2老年代,新创建的对象都会被分配在0年轻代,当年轻代达到上限就触发垃圾回收机制,释放可以回收的内存,没有被回收的对象将被转移到1中年代,中年代同理。以空间换时间,减少了标记清除的操作,增加了垃圾回收的效率。