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

如何在python中创建无法收集的垃圾?,python,garbage-collection,Python,Garbage Collection,我有一台大型长期运行的服务器,几周后内存使用率稳步攀升 一般来说,正如下文所指出的,泄漏不太可能是我的问题;然而,我没有太多的事情要做,所以我想看看是否有任何泄漏 获取控制台输出很棘手,所以我没有使用gc.set\u debug()运行。不过这不是什么大问题,因为我很容易添加了一个API,让它运行gc.collect(),然后遍历gc.garbage,并通过HTTP将结果发送回给我 我的问题是在本地短时间运行它,我的gc.garbage总是空的。我无法在部署之前测试列出漏洞的代码 是否有一个简单

我有一台大型长期运行的服务器,几周后内存使用率稳步攀升

一般来说,正如下文所指出的,泄漏不太可能是我的问题;然而,我没有太多的事情要做,所以我想看看是否有任何泄漏

获取控制台输出很棘手,所以我没有使用
gc.set\u debug()
运行。不过这不是什么大问题,因为我很容易添加了一个API,让它运行
gc.collect()
,然后遍历
gc.garbage
,并通过HTTP将结果发送回给我

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


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

任何可终结对象(即,具有
\uu del\uuu
方法的对象)的循环都是无法收集的(因为垃圾收集器不知道以哪个顺序运行终结器):

>>类可终结:
...     def_uudel_u_u(self):通过
...
>>>a=可终结()
>>>b=可终结()
>>>a.x=b
>>>b.x=a
>>>德拉
>>>德尔b
>>>导入gc
>>>gc.collect()
4.
>>>垃圾
[,
]

但一般来说,我不太可能认为您的问题是由于无法收集的垃圾造成的,除非您有使用终结器的习惯。这很可能是由于活动对象的累积或内存的碎片(因为Python使用的是不移动的收集器)。

这不是答案,但Giovanni Bajo上个月在EuroPython上就调试内存泄漏进行了精彩的演讲。谈话视频在这里:似乎它至少需要一个种子:(对不起,我正在尝试创建垃圾,只是为了看看它在python中是如何工作的。在上面的示例中,垃圾是什么?删除引用之前的a和b的实例?自己看:print
id(a)
id(b)
在删除它们之前,查看这些id是否匹配
id(gc.garbage[0])
id(gc.garbage[1])
>>> 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>]