首页 > 解决方案 > python tracemalloc 模块分配统计信息何时与 ps 或 pmap 中显示的不匹配?

问题描述

我正在尝试追踪内存泄漏,所以我已经完成了

import tracemalloc
tracemalloc.start()

<function call>

# copy pasted this from documentation
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)

这表明没有重大分配,所有内存分配都非常小,而我看到分配了 8+ GB 内存(在运行命令之前pspmap之后以及在运行垃圾收集之后检查)。此外,tracemalloc.get_traced_memory确认tracemalloc没有看到很多分配。pympler也没有看到分配。

有谁知道什么时候会出现这种情况?某些模块正在使用 cython,这会导致 tracemalloc 出现问题吗?

在 pmap 中,分配如下所示:

0000000002183000 6492008 6491876 6491876 rw--- [ anon ]

标签: pythonmemory-managementcython

解决方案


tracemalloc的文档中:

The tracemalloc module is a debug tool to trace memory blocks allocated by Python.

换句话说,没有被python解释器分配的内存不会被tracemalloc看到。这将包括PyMallocC-API 级别未完成的任何事情,包括通过扩展使用的本机代码或直接malloc使用的扩展代码的所有标准 libc 调用。malloc

如果没有代码来重现,这里是否是这种情况是不可能确定的。您可以尝试通过例如 valgrind 在 python 之外运行本机代码部分,以检测本机代码中的内存泄漏。

如果有 cython 代码正在执行malloc,则可以切换到PyMalloc对其进行跟踪。


推荐阅读