我正在努力解决Python应用程序中的内存泄漏问题。
这就是事情 - 它实际上似乎只发生在Windows Server 2008(而不是R2)上,而不是早期版本的Windows上,它看起来也不像是在Linux上发生的事情(尽管我没有做到这么多在Linux上测试。)
要对其进行故障排除,我在垃圾收集器上设置了调试:
gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS)
然后,我定期记录gc.garbage的内容。
事实是,gc.garbage总是空的,但我的内存使用率一直在上升。
非常令人费解。
答案 0 :(得分:26)
如果gc.garbage中没有任何垃圾,那么我不确定你要通过启用GC调试来做什么。当然,它会告诉你哪些对象被认为是清理,但如果最终没有无法清理的循环引用,那就不是特别有趣了。
如果您的程序根据操作系统使用越来越多的内存,通常会有四种不同的情况:
gc
模块无法清除的对象之间的循环引用(通常是因为其中一个方法具有__del__
方法。)根据你的描述,它听起来不太可能是#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,但是代码非常糟糕,我们决定重写它是最简单的。