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