Python的垃圾回收机制

gc主要使用引用计数 reference counting 来跟踪和回收垃圾,在引用计数的基础上,通过标记-删除解决容器对象可能产生的循环引用问题,通过分代回收以空间换时间的方法提高垃圾回收效率。

引用计数,当一个对象被引用时,它的引用计数+1 ,当引用的对象被删除时,引用计数-1 。当引用计数为0时,该对象的生命周期就结束了。优点: 简单,实时性;缺点,维护引用计数消耗资源,因为具有时效性且遍历的对象是所有引用计数;循环引用无法解决。 循环引用的原因是对象没有被任何外部变量引用,对象之间互相引用对方,从而造成的内存无法释放。

内存中分为两块区域,栈区存放变量,堆区存放变量的值,内存管理回收的是堆区的值。

标记-清除机制,基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点,以引用为边构成的图,把所有可以访问到对象打上标记,然后清扫一遍内存空间,把所有没有标记的对象释放。

分代技术,分代的整体思想是: 将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合代表一个代,垃圾收集频率随着代的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。

Python默认了三代对象集合,索引数越大,对象存活时间越长。针对的对象一般是全局变量之类的,优点是占用较少的性能,缺点是存活时间长的变量回收的时间上一般也较长。

原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374982.html