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

Wil*_*ill 7 python garbage-collection

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

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

获得控制台输出是棘手的,所以我没有运行gc.set_debug().这不是一个大问题,因为我已经轻松添加了一个API来让它运行gc.collect()然后迭代gc.garbage并通过HTTP将结果发回给我.

我的问题是在本地运行一小段时间我gc.garbage总是空着.在部署之前,我无法测试列出泄漏的代码.

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

Gar*_*ees 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>]
Run Code Online (Sandbox Code Playgroud)

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

  • 看看你自己:在删除它们之前打印`id(a)`和`id(b)`,看看这些id是否匹配`id(gc.garbage [0])`和`id(gc.garbage [1] )``收集后. (2认同)