您是否认为垃圾收集器可以跟踪所有Python对象?
Python使用两种技术来清理垃圾。一种是引用计数,它影响所有对象,但不能清除直接或间接引用的对象。这就是实际的垃圾收集器的来源:python有gc模块,该模块在它知道的对象中搜索循环引用。只有可能成为参考循环一部分的对象才加入循环gc。因此,例如,列表可以,但字符串不可以;字符串不引用任何其他对象。
循环gc会自动跟踪所有Python类及其实例。除非稍加努力,否则C中定义的类型不是。所有可能属于循环的内建类型都可以。但这确实意味着gc模块仅知道所运行的类型。
除了收集机制外,Python还具有自己的聚合内存分配器(obmalloc),它分配整个内存区域,并将内存用于它创建的大多数较小对象。现在,Python会在这些区域完全排空时(很长一段时间没有)释放这些区域,但是实际上排空区域是相当罕见的:因为Python对象是不可移动的,所以不能将一些散乱的对象移到另一个区域区。