Python 的垃圾回收机制(GC),是自动内存管理的核心部分,它负责回收不再使用的对象所占用的内存,防止内存泄漏。Python 主要通过以下三种机制来进行垃圾回收:
一、引用计数
原理:
每个对象都有一个引用计数器,记录有多少个变量或结构引用该对象。
- 每当有一个新的引用对象指向该对象时,引用计数加1;
- 当某个引用被删除或重新赋值时,引用计数减1;
- 当引用计数变为0时,表示没有引用再使用该对象,对象立即被释放。
示例:
python
a = [1, 2, 3] # 引用计数为1
b = a # 引用计数为2
del a # 引用计数减1 → 变为1
del b # 引用计数减1 → 变为0,对象被回收
缺点:
- 无法处理循环引用问题
python
a = []
b = []
a.append(b)
b.append(a)
# 此时 a 和 b 相互引用,即使 del a, del b 后它们的引用计数也不为0
二、标记-清除
解决的问题
用于解决循环引用的问题
工作流程:
- 标记阶段 :从根对象(如全局变量、栈中的变量等)出发,递归追踪所有可达的对象,并将它们标记为存活
- 清除阶段:遍历堆中所有对象,未被标记的对象视为不可达,将被回收
应用对象:
只适用于支持容器类型(如 list、dict、class 实例等),因为这些对象可以包含其他对象,从而形成循环引用。
三、分代回收
思想基础
大多数对象的生命周期都很短(即弱代假说 ),所以将对象生命周期按生存周期分成不同 代,对不同代的对象进行不同程度的垃圾回收。
Python 中的三代:
- 第 0 代(Gen 0):新创建对象;
- 第 1 代 (Gen 1):经历一次 GC 后还活着的对象;
- 第 2 代 (Gen 2):多次 GC 后任然存活的对象
回收频率:
- Gen0 被检查的最频繁
- Gen1 次之
- Gen2 最少
控制方式
可以通过 gc
模块查看和调整代的阈值
python
import gc
print(gc.get_threshold()) # 默认值通常是 (700, 10, 10)
表示:
- 当第 0 代对象数量达到 700 时触发第 0 代GC;
- 每执行10 次第0代 GC,触发一次第1代GC;
- 每执行10次第一代 GC,触发一次第二代GC。
四、gc 模块
import gc gc.enable() # 开启自动GC(默认) gc.disable() # 关闭自动GC gc.collect() # 手动触发一次完整的GC gc.set_threshold(800, 10, 10) # 设置GC阈值
python
import gc
gc.enable() # 开启自动GC(默认)
gc.disable() # 关闭自动GC
gc.collect() # 手动触发一次完整的GC
gc.set_threshold(800, 10, 10) # 设置GC阈值