Python - 内存泄漏

时间:2010-04-20 21:47:02

标签: python memory-leaks

我正在努力解决Python应用程序中的内存泄漏问题。

这就是事情 - 它实际上似乎只发生在Windows Server 2008(而不是R2)上,而不是早期版本的Windows上,它看起来也不像是在Linux上发生的事情(尽管我没有做到这么多在Linux上测试。)

要对其进行故障排除,我在垃圾收集器上设置了调试:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS)

然后,我定期记录gc.garbage的内容。

事实是,gc.garbage总是空的,但我的内存使用率一直在上升。

非常令人费解。

3 个答案:

答案 0 :(得分:26)

如果gc.garbage中没有任何垃圾,那么我不确定你要通过启用GC调试来做什么。当然,它会告诉你哪些对象被认为是清理,但如果最终没有无法清理的循环引用,那就不是特别有趣了。

如果您的程序根据操作系统使用越来越多的内存,通常会有四种不同的情况:

  1. 您的应用程序正在存储越来越多的东西,并保留对每个东西的引用,以便它们不被收集。
  2. 您的应用程序正在创建gc模块无法清除的对象之间的循环引用(通常是因为其中一个方法具有__del__方法。)
  3. 您的应用程序正在释放(并重新使用)内存,但操作系统不希望重用内存,因此它会不断分配新的内存块。
  4. 泄漏是真正的内存泄漏,但在您的代码正在使用的C / C ++扩展模块中。
  5. 根据你的描述,它听起来不太可能是#1(因为它在任何操作系统上的行为都相同),而且显然也不是#2(因为gc.garbage中没有任何内容。)考虑#3,Windows(一般情况下) )有一个内存分配器,这对于分段分配来说是出了名的坏事,但是Python的obmalloc前端用于malloc()。它可能仍然是Windows Server 2008系统库中的特定问题,使其看起来像您的应用程序正在使用越来越多的内存。或者它可能是#4,C / C ++扩展模块,或Python或扩展模块使用的DLL,内存泄漏。

答案 1 :(得分:3)

一般来说,python中内存泄漏的第一个罪魁祸首是在 C扩展中找到。
你使用其中任何一个吗?

此外,你说这个问题只发生在2008年;然后,我会检查扩展是否存在任何不兼容性,因为在Vista和2008中,有很多小的更改导致该字段出现问题。
作为替代方案,尝试在Windows兼容模式下执行您的应用程序,选择Windows XP - 这可以帮助解决问题,特别是如果它与安全性的变化有关。

答案 2 :(得分:2)

迟到总比没有好。解决了这个很快,但忘了发布答案。我们最终撕掉了Twisted代码并使用了CherryPy。它更轻,更容易使用,而且似乎不再发生。它可能是我们的错,它发生了而不是Twisted,但是代码非常糟糕,我们决定重写它是最简单的。