Python垃圾回收的原理

170 阅读2分钟

Python垃圾回收的原理

Python 的垃圾回收主要基于引用计数法

引用计数的原理:一个对象被引用则该对象的引用计数加一,当引用计数为 0 的时候,该对象就会被回收。

但是引用计数存在缺点,无法处理循环引用的情况。

这个时候就引出另一种垃圾回收策略:标记-清除法(Mark-Sweep)。这种策略会首先确定一组根对象,从根对象开始遍历他们引用的对象,以及这些对象引用的其他对象,遍历到的对象都会被标记为“活动的”,没有被标记的就会被视为垃圾。

标记清除法的主要缺点是执行垃圾回收时,需要暂停程序的其他所有操作(称为“停顿时间”),这在实时性要求较高的系统中可能是一个问题。此外,标记和清除两个阶段可能会导致程序性能的短暂下降。

为了解决这些性能问题,我们再引入“分代回收”的方法。分代回收基于一个共识:存在越久的对象被回收的概率越小。

分代回收首先根据对象的存活时间将对象分配到不同的代(通常是三代)中,新创建的对象被放入第 0 代,随着垃圾回收过程的进行,存活的对象逐渐被晋升到更高的代。每个代都有独立的阈值,当其中的对象数量达到这个阈值时,就会触发该代的垃圾回收。

当第 0 代(最年轻的代)的对象达到阈值时,会触发垃圾回收。这时,垃圾回收器会检查第 0 代中的对象,决定哪些对象需要被回收,哪些对象会被晋升到第 1 代。如果连续几次回收后第 1 代的对象也达到了其阈值,那么第 1 代的垃圾回收也会被触发,此过程可能继续导致第 2 代的回收。