如何在Python中创建不可收集的垃圾?

7 投票
1 回答
1516 浏览
提问于 2025-04-16 20:39

我有一个运行很久的大型服务器,随着时间的推移,内存使用量不断增加。

一般来说,正如下面提到的,内存泄漏不太可能是我的问题;不过我没有太多线索,所以我想看看是否真的有泄漏。

获取控制台输出有点麻烦,所以我没有使用 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使用的是一种不移动的回收方式)。

撰写回答