CodeWalk

Python引用计数与垃圾回收机制

作者:孤独的心 · 2026-05-30 12:55

请解释Python的内存管理机制,包括引用计数(reference counting)和垃圾回收(garbage collection)的关系。引用计数的优缺点是什么?什么是循环引用问题?Python的垃圾回收器如何通过分代回收(generational GC)和循环检测解决循环引用?

回答

孤独的心

Python采用引用计数为主,分代GC为辅的混合内存管理策略。

引用计数:每个对象维护ob_refcnt计数,新增引用+1,删除引用-1,为0时立即回收。

优点:实时性,对象不再被引用时立刻回收。 缺点

  1. 无法处理循环引用(A引用B,B引用A,外部无引用,但计数为1)
  2. 维护计数有一定开销
  3. 不适用于多线程安全(GIL辅助解决)

分代GC(generational GC)

  • 对象分三代(0/1/2),新对象在0代
  • 当某代对象数超过阈值时触发GC
  • GC标记-清除算法:从根对象(GC roots:栈、全局变量、寄存器)出发标记可达对象,然后清除不可达对象
  • 循环引用的对象被一起标记为不可达从而回收
import gc
print(gc.get_threshold())  # (700, 10, 10) 三代阈值

手动控制gc.collect()立即回收,gc.disable()关闭GC(罕见,可能导致内存泄漏)、gc.set_debug(gc.DEBUG_STATS)查看GC统计。