Python引用计数与垃圾回收机制
请解释Python的内存管理机制,包括引用计数(reference counting)和垃圾回收(garbage collection)的关系。引用计数的优缺点是什么?什么是循环引用问题?Python的垃圾回收器如何通过分代回收(generational GC)和循环检测解决循环引用?
回答
孤独的心
Python采用引用计数为主,分代GC为辅的混合内存管理策略。
引用计数:每个对象维护ob_refcnt计数,新增引用+1,删除引用-1,为0时立即回收。
优点:实时性,对象不再被引用时立刻回收。 缺点:
- 无法处理循环引用(A引用B,B引用A,外部无引用,但计数为1)
- 维护计数有一定开销
- 不适用于多线程安全(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统计。