你认为垃圾回收器可以跟踪所有 Python 对象吗?
Python 使用两种技术来清理垃圾。一种是引用计数,它影响所有对象,但无法清理直接或间接相互引用的对象。这就是实际的垃圾回收器发挥作用的地方:python 有 gc 模块,它搜索其已知对象中的循环引用。只有可能成为引用循环一部分的对象才会参与循环 gc。因此,例如,列表会参与,但字符串不会;字符串不引用任何其他对象。
所有 Python 类及其实例都会自动被循环 gc 跟踪。在 C 中定义的类型不会,除非它们付出一些努力。所有可能成为循环一部分的内置类型都会。但这确实意味着 gc 模块只知道那些配合的类型。
除了收集机制之外,还有这样一个事实,即 Python 有自己的聚合内存分配器 (obmalloc),它分配整个内存区域并使用该内存来创建它创建的大多数较小的对象。Python 现在确实会在这些区域完全为空时释放这些区域(很长一段时间它都没有这样做),但实际上清空一个区域是相当罕见的:因为 Python 对象不可移动,所以您不能只是将一些滞留对象移动到另一个区域。
广告