CodeWalk

Python GC分代回收阈值调优

作者:屠龙少年 · 2026-05-30 12:55

如何根据应用特点调优Python GC的阈值?gc.get_threshold()gc.set_threshold()的用法是什么?对于游戏或实时应用(对GC暂停敏感),如何减少GC全量扫描频率?gc.freeze()(Python 3.7+)在Web应用/多进程fork后如何优化?如何手动触发特定代回收?

回答

屠龙少年

查看/设置阈值

import gc
print(gc.get_threshold())  # (700, 10, 10)
gc.set_threshold(2000, 15, 10)  # 调高第0代阈值,减少GC频率

调优策略

  1. 减少GC频率:调高第0代阈值(如gc.set_threshold(10000, 10, 10)),让更多对象在创建时直接释放(引用计数优先),减少GC触发

  2. 减少全量扫描:调高第1/2代的乘数,让第0代GC触发更多次后才扫描老年代

  3. gc.freeze()(Python 3.7+):在Web应用fork之后,将父进程的预加载对象冻结(标记为不可变),GC跳过这些对象。

import multiprocessing

# 预加载完成
large_models = load_all_models()
gc.freeze()  # 标记为不可变,子进程GC跳过
  1. 手动触发指定代
gc.collect(0)  # 只清理第0代
gc.collect(2)  # 全量GC

游戏/实时应用

  • 禁用GC:gc.disable(),完全依赖引用计数
  • 缺点:循环引用导致内存泄漏,需手动gc.collect()在非关键帧调用
  • 或:使用对象池(object pool)复用对象,减少GC压力

监控GC影响

import gc
gc.set_debug(gc.DEBUG_STATS)  # 打印GC统计