Python内存泄漏追踪?

7
一些Python程序在运行时会占用越来越多的内存(“top”命令中的VIRT和RES列不断增加),但我已经非常仔细地检查了代码,确信没有内存泄漏(没有使用任何字典或全局变量,只是一个主方法调用若干次子方法)。我使用heapy对内存使用情况进行了分析。
from guppy import hpy;
heap = hpy();
.....
print heap.heap();

每次主方法调用子方法时,出乎意料地总是给出相同的输出。但内存使用量仍在不断增加。
我想知道我是否没有正确使用heapy,或者“top”命令中的VIRT和RES并没有真正反映我代码使用的内存?
还是有人能够提供更好的方法来跟踪Python脚本中的内存使用情况吗?
非常感谢!

1
听起来子方法可能存在泄漏。假设您可以访问其代码,请尝试使用 sys.getsizeof(object) 或者 pysizer 来测量子方法内部的对象大小。 - smci
1个回答

1
两种可能的情况:
  • 如果您的函数是纯Python编写的,则可能的原因包括:

    • 您正在存储越来越多的大型对象
    • 您正在具有__del__方法的对象循环中,gc不会触及这些对象

    我建议使用gc模块和gc.garbage以及gc.get_objects函数(请参见http://docs.python.org/library/gc.html#module-gc),以获取现有对象列表,然后可以通过查看每个对象的__class__属性来内省它们,例如获取有关对象类的信息。

  • 如果您的函数至少部分是用C / C ++编写的,则问题可能在于该代码。上面的建议仍然适用,但无法查看所有泄漏:您将看到由于缺少对PY_DECREF的调用而导致的泄漏,但没有相应的释放低级别的C / C ++分配。为此,您需要使用valgrind。有关该主题的更多信息,请参见this question


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接