我有一个长期运行的大型服务器,几周以来内存使用量稳步攀升。
一般来说,如下所述,泄漏不太可能是我的问题;但是,我没有太多可以继续下去所以我想知道是否有任何泄漏。
获取控制台输出很棘手,因此我没有使用gc.set_debug()
运行。这不是一个大问题,因为我已经轻松添加了一个API来让它运行gc.collect()
,然后遍历gc.garbage
并通过HTTP将结果发回给我。
我的问题是在本地短时间内运行gc.garbage
始终为空。在部署之前,我无法测试列出泄漏的代码。
是否有一个简单的方法来创建无法收集的垃圾,以便我可以测试列出垃圾的代码?
答案 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使用的是非移动的收集器)。