python分代回收是为解决引用计数无法处理循环引用而设的辅助机制,依据“弱代假说”将对象分为三代:0代高频扫描新对象,达阈值(默认700)即回收;1代每10次0代回收触发一次,扫描0、1代;2代每10次1代回收触发一次,全代扫描兜底防泄漏;存活对象逐代晋升,回收时结合标记-清除算法实现高效内存管理。

Python分代回收是为弥补引用计数无法处理循环引用而设计的辅助机制,核心依据是“弱代假说”:新创建的对象更可能很快变成垃圾,而长期存活的对象更可能继续存活。因此,CPython将对象按存活时间划分为三代,区别对待,提升回收效率。
0代:新对象的高频扫描区
所有新创建的容器对象(如列表、字典、类实例等)默认属于第0代。这一代触发最频繁——当新分配对象数与已回收对象数之差达到阈值(默认700),就立即启动0代回收。它只扫描0代对象,重点检查刚产生的循环引用,开销小、响应快。例如在循环中反复生成临时列表,它们大多在0代就被识别并清理。
1代:经历一次回收后的“中年”对象
每次0代回收后仍存活的对象,会被晋升到第1代。1代回收不独立触发,而是每发生10次0代回收时自动执行一次,扫描范围扩大到0代+1代。这种设计减少了对“稍老”对象的重复检查,同时仍能及时捕获那些跨多个短周期存活下来的潜在循环引用。
2代:长期存活对象的低频保障层
再经一次1代回收后仍存活的对象,升入第2代。2代回收频率最低——每10次1代回收才触发一次,且会扫描全部三代。它不是为了高频清理,而是兜底:确保即使极少数对象因各种原因长期滞留,最终也能被标记-清除机制识别和回收,防止内存缓慢泄漏。
立即学习“Python免费学习笔记(深入)”;
对象晋升与回收协同逻辑
分代机制本身不直接回收内存,而是调度“标记-清除”算法执行实际清理:
- 每次回收都从根对象(如全局变量、栈帧中的局部变量)出发,标记所有可达对象
- 未被标记但存在于当前扫描代中的对象(尤其是互相引用又不可达的容器),被判定为垃圾并清除
- 存活对象按规则向更高代移动,越老的对象被扫描次数越少
这种结构让Python在保持引用计数实时性的同时,用可控的暂停代价解决了循环引用问题,整体内存管理既灵敏又稳健。










