Python: GC

27th March 2021 at 12:43pm

GC (garbage collection) ,指 Python 自动将不再被使用的值回收。

理解 GC 前应该先理解 Python 的 name 和 value

Python 的 value 几乎全部存在于堆中(type object 是例外)。一个 value 假如不再被使用,会被 Python 回收掉。但也有一些情况不会被回收,比如小的(512 字节以内)object,频繁分配及回收的成本会高于让它一直存在在内存中,因此它可能等到 Python 程序结束才被释放。

Python 使用的 GC 算法是引用计数。由于 name 是有作用域的,一个 name 离开它的作用域后,它所引用的值的引用计数减 1。目前的 CPython 实现中,一旦值的引用计数为 0,则会被马上回收。del 关键字也可以使一个名字在其作用域中失效。

引用计数无法解决循环依赖(reference cycle)的问题。循环依赖的例子:

# 引用自身
lst = []
lst.append(lst)

# 互相引用
object_1 = {}
object_2 = {}
object_1['obj2'] = object_2
object_2['obj1'] = object_1

Python 使用了一套 generational gc 算法来检测循环依赖并做回收。这套算法不是常驻运行,而是间歇性地运行。这套算法的实现和优化,看这份官方文档的 PDF 及我做的注释:

电脑上如果 PDF 不展示或者展示不正常,使用 Chrome 并安装 PDF Viewer 插件。其他情况请下载文件查看:design-of-cpythons-garbage-collector.pdf

参考

电脑上如果 PDF 不展示或者展示不正常,使用 Chrome 并安装 PDF Viewer 插件。其他情况请下载文件查看:python-garbage-collection.pdf