Python 采用的是内存管理机制为垃圾回收机制,具体表现为引用计数,以及多代回收机制,详细介绍如下:
引用计数
引用计数是 Python 主要采用的内存管理机制。Python 中任何一个对象都有它的引用计数,引用计数的作用就是记录每个对象有多少引用与之相关联。当一个对象被创建后,其引用计数就被初始化为 1。当它被其他变量也关联使用时,它的引用计数则相应地增加。如果一个对象的引用计数变为 0,它就会被 Python 的垃圾回收机制回收。
当然,引用计数是存在问题的,当出现循环引用的时候,Python 的垃圾回收机制便无法清理对象占用的内存。这个时候,就需要 Python 自带的垃圾回收机制,即多代回收机制。
多代回收机制
由于很多程序中存在大量的短期对象,这对 Python 的垃圾回收是很有挑战性的。为此,Python 的垃圾回收机制采用多代回收机制,即将内存根据存活时间划分不同的代,每代采用不同的垃圾回收策略。
Python 将内存分为三代,编号为 0,1,2。新创建的对象放在 0 代中,如果 0 代满了,就会触发一次垃圾收集。经过一次垃圾收集后,如果某些对象还活着,就会被移到 1 代中,将 0 代空出来。同样的,如果 1 代满了,就触发一次垃圾收集,将活着的对象移到 2 代中,同时将 1 代留出空位。以此类推。
多代回收机制中每一代采用的垃圾回收方式不同。当创建新对象时,Python 将该对象分配到 0 代中,并给这个对象打上标记。当程序运行一段时间后,垃圾回收机制会开始收集 0 代中的垃圾,当 0 代中的对象被回收时,如果有一部分对象仍然是有用的,Python 会将它们移动到 1 代中,随着时间的推移,生命周期长的对象逐渐“晋升”到更高的代中。最终,Python 将长时间存活的对象放在 2 代中,在程序正常退出时清理它们,以释放内存。
多代回收机制的优点在于,对于短生命周期的对象,Python 可以通过频繁地进行垃圾回收来保证程序运行内存的及时释放。对于生命周期较长的对象,Python 会通过多代回收机制提高垃圾回收效率,节约内存。