Python垃圾回收以引用计数为主,对象refcount为0时立即释放;循环引用由gc模块用分代收集(三代)清理;可手动控制gc启停、强制回收、调参及调试。
Python默认使用引用计数作为最核心的内存管理机制。每个对象内部都维护一个refcount,记录当前有多少变量或数据结构正指向它。当这个数值降为0,对象立即被释放,内存立刻归还给系统。这是最及时、最确定的回收方式。
例如:
a = [1, 2, 3] → 列表对象 refcount = 1
b = a → 同一列表,refcount 变为 2
del a → refcount 减为 1
del b → refcount 变为 0 → 对象被销毁
引用计数无法处理循环引用:比如A持有B的引用,B也持有A的引用,但外部已无变量指向它们。此时两个对象 refcount 都不为0,却成了“内存孤岛”。Python用gc模块周期性地扫描并识别这类不可达的循环结构。
gc模块基于三色标记-清除算法(实际是简化版的分代收集)工作:
1/2),新对象在第0代虽然gc默认开启且自动运行,但你可以在需要时干预:
如果自定义类定义了__del__方法,该对象会被gc特殊对待——它不会被直接清除,而是先放入gc.garbage列表(需手动处理),防止<__del__>执行期间引发异常导致状态不一致。
注意:__del__不是析构函数,不保证何时调用,也不推荐依赖它做关键资源释放(应优先用with语句或显式close())。
若发现内存泄漏怀疑有未清理的循环引用,可临时启用:
gc.set_debug(gc.DEBUG_SAVEALL) → 所有无法回收的对象会留在gc.garbage中供检查