如何追踪Python内存泄漏?
我的Python程序在运行时,内存使用量越来越大(在“top”命令中,VIRT和RES这两列的数值一直在增加)。
不过,我仔细检查了我的代码,确信没有内存泄漏(没有使用任何字典,也没有全局变量。就是一个主方法调用一个子方法多次)。
我使用heapy来分析我的内存使用情况,方法是
from guppy import hpy;
heap = hpy();
.....
print heap.heap();
每次主方法调用子方法时。令人惊讶的是,它每次都给出相同的输出。但内存使用量却一直在增长。
我在想,是不是我没有正确使用heapy,或者“top”命令中的VIRT和RES并不真正反映我代码的内存使用情况?
有没有人能提供更好的方法来追踪Python脚本中的内存使用情况?
非常感谢!
1 个回答
1
有两种可能的情况:
你的函数是纯 Python 写的,这种情况下可能的原因包括:
- 你存储了越来越多的大对象
- 你有一些对象之间形成了循环关系,并且这些对象有一个
__del__
方法,而垃圾回收(gc)不会处理这些对象
我建议你使用
gc
模块中的gc.garbage
和gc.get_objects
函数(可以参考 这个链接),这样可以获取当前存在的对象列表。然后你可以查看每个对象的__class__
属性,以获取关于对象类的信息。你的函数至少部分是用 C 或 C++ 写的,这种情况下问题可能出在那段代码上。上面的建议仍然适用,但可能无法看到所有的内存泄漏:你会看到因为缺少 PY_DECREF 调用而导致的泄漏,但对于没有相应释放的低级 C/C++ 分配就看不到了。对此你需要使用 valgrind。有关这个主题的更多信息,可以查看 这个问题。