python的内存回收机制
1.python内存存储相关
堆和栈
堆:Python中的堆存储一般存储的是对象相关的信息如 对象的数据(字典列表等),堆内存是由 Python 的内存管理器控制的,堆内存的生命周期不受函数调用栈影响。
栈:栈中存储的是函数的参数,以及相关的函数变量,此栈是通过操作系统控制管理的,程序结束时会自动清理。
引用计数
每个对象都有一个引用计数器,表示该对象被引用的次数。每当有一个新的引用指向该对象时,引用计数增加;当引用失效时,计数减少。当一个对象的引用计数变为 0 时,表示该对象不再被使用,Python 会自动回收这块内存。
缺点:如果存在循环引用,即两个或多个对象相互引用而没有外部引用,这些对象的引用计数永远不会变为 0,从而导致内存泄漏。
GC的垃圾回收
为了应对引用计数的局限,Python 使用 垃圾回收器(GC)来检测和回收循环引用。Python 的垃圾回收使用的是 分代回收算法,通过将对象分成不同的代(generation)来优化回收效率。
- 分代回收:Python 将对象分为三个代(generation):
- 第 0 代:新创建的对象,引用计数高的对象容易被回收。
- 第 1 代:经过多次回收后还存活的对象。
- 第 2 代:非常长时间存活的对象。
对象在每一代的存活时间越长,它的回收频率越低。较老的对象不太可能有垃圾回收的机会,因此 Python 会更频繁地回收年轻代的对象。