如何在Python中创建不可收集的垃圾?
我有一个运行很久的大型服务器,随着时间的推移,内存使用量不断增加。
一般来说,正如下面提到的,内存泄漏不太可能是我的问题;不过我没有太多线索,所以我想看看是否真的有泄漏。
获取控制台输出有点麻烦,所以我没有使用 gc.set_debug()
。不过这不是大问题,因为我很容易添加了一个API,让它运行 gc.collect()
,然后遍历 gc.garbage
,把结果通过HTTP发回给我。
我的问题是,在本地短时间运行时,我的 gc.garbage
总是空的。我无法在部署之前测试我的代码来列出泄漏。
有没有简单的方法可以创建一些无法被回收的垃圾,这样我就可以测试我的列出垃圾的代码了?
1 个回答
13
任何有可终结对象循环的情况(也就是那些有 __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使用的是一种不移动的回收方式)。