如何追踪Python内存泄漏?

7 投票
1 回答
1663 浏览
提问于 2025-04-16 22:11

我的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.garbagegc.get_objects 函数(可以参考 这个链接),这样可以获取当前存在的对象列表。然后你可以查看每个对象的 __class__ 属性,以获取关于对象类的信息。

  • 你的函数至少部分是用 C 或 C++ 写的,这种情况下问题可能出在那段代码上。上面的建议仍然适用,但可能无法看到所有的内存泄漏:你会看到因为缺少 PY_DECREF 调用而导致的泄漏,但对于没有相应释放的低级 C/C++ 分配就看不到了。对此你需要使用 valgrind。有关这个主题的更多信息,可以查看 这个问题

撰写回答