Python 自身具备垃圾回收机制,可以屏蔽内存管理的复杂性,使开发者可以更好的关注核心的业务逻辑。
Python 的垃圾回收机制,以引用计数为主,标记清除和分代回收为辅。
引用计数
Python 内部通过引用计数机制来统计一个对象被引用的次数。在对象进行实例化的时候通过 ob_refcnt 参数
记录这个对象的被变量引用的次数,当一个对象有新的引用时,ob_refcnt 加 1 。当这个数变成0的时候,就说明这个对象没有被引用了。这个时候它就变成了“垃圾”。
引用计数简单、实时性高,但需要额外的空间维护引用计数,并且无法解决循环引用问题。
标记清除
标记清除可以处理循环引用的问题。策略在进行垃圾回收时分成了两步,分别是:
策略在进行垃圾回收时分成了两步,分别是:
- 标记阶段,遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达。
- 清除阶段,再次遍历对象,如果发现某个对象没有标记为可达,则就将其回收。
分代回收
分代回收建立标记清除的基础之上,因为我们的标记-清除策略会将我们的程序阻塞。为了减少应用程序暂停的时间,Python 通过“分代回收”策略。以空间换时间的方法提高垃圾回收效率。
当分配对象的个数达到 700 时,进行一次 0 代回收,当进行 10 次 0 代回收以后触发一次 1 代回收,当进行 10 次 1 代回收以后触发一次 2 代回收。