如何在python中创建无法收集的垃圾?

时间:2011-07-01 10:34:52

标签: python garbage-collection

我有一个长期运行的大型服务器,几周以来内存使用量稳步攀升。

一般来说,如下所述,泄漏不太可能是我的问题;但是,我没有太多可以继续下去所以我想知道是否有任何泄漏。

获取控制台输出很棘手,因此我没有使用gc.set_debug()运行。这不是一个大问题,因为我已经轻松添加了一个API来让它运行gc.collect(),然后遍历gc.garbage并通过HTTP将结果发回给我。

我的问题是在本地短时间内运行gc.garbage始终为空。在部署之前,我无法测试列出泄漏的代码。

是否有一个简单的方法来创建无法收集的垃圾,以便我可以测试列出垃圾的代码?

1 个答案:

答案 0 :(得分:12)

可终结对象的任何循环(即具有__del__方法的对象)都是无法收集的(因为垃圾收集器不知道运行终结器的顺序):

>>> class Finalizable:
...     def __del__(self): pass
...
>>> a = Finalizable()
>>> b = Finalizable()
>>> a.x = b
>>> b.x = a
>>> del a
>>> del b
>>> import gc
>>> gc.collect()
4
>>> gc.garbage
[<__main__.Finalizable instance at 0x1004e0b48>,
 <__main__.Finalizable instance at 0x1004e73f8>]

但总的来说,我似乎不太可能认为你的问题是由于无法收集的垃圾,除非你习惯使用终结者。它更可能是由于活动对象的积累,或者是内存的碎片化(因为Python使用的是非移动的收集器)。