Python - 内存泄漏

Dav*_*ave 8 python memory-leaks

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

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

要解决它,我在垃圾收集器上设置调试:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS)
Run Code Online (Sandbox Code Playgroud)

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

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

非常令人费解.

Tho*_*ers 25

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

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

  1. 您的应用程序正在存储越来越多的东西,保留对每个东西的引用,以便它们不被收集.
  2. 您的应用程序正在创建gc模块无法清除的对象之间的循环引用(通常因为其中一个有__del__方法.)
  3. 您的应用程序正在释放(并重新使用)内存,但操作系统不希望重用内存,因此它会不断分配新的内存块.
  4. 泄漏是真正的内存泄漏,但在您的代码正在使用的C/C++扩展模块中.

根据你的描述,它听起来不太可能是#1(因为它在任何操作系统上的行为都相同)而且显然也不是#2(因为gc.garbage中没有任何内容.)考虑到#3,Windows(通常)有一个内存分配器,分散的分配是众所周知的糟糕,但Python的obmalloc前端与它的前端malloc().它可能仍然是Windows Server 2008系统库中的特定问题,使其看起来像您的应用程序正在使用越来越多的内存.或者它可能是#4,C/C++扩展模块,或Python或扩展模块使用的DLL,内存泄漏.