Python 自带的 tracemalloc 模块能够记录内存分配调用的栈信息,是排查内存泄漏和内存异常增长的有效手段。它从 Python 3.4 开始就被纳入标准库,使用起来没有额外依赖。

如何开启 tracemalloc 跟踪
在程序入口处调用 tracemalloc.start() 即可开始跟踪内存分配。通常建议在程序启动最早的位置开启,这样才能覆盖到全部内存行为。
import tracemalloc
# 开启内存跟踪,保存 25 层调用栈
tracemalloc.start(25)
# 下面是业务代码
def load_data():
return [i for i in range(100000)]
data = load_data()
获取当前内存快照
通过 tracemalloc.get_snapshot() 可以拿到当前时刻的内存快照,快照里包含了所有未释放内存的分配位置与大小。
import tracemalloc
tracemalloc.start()
# 执行业务逻辑
snapshot = tracemalloc.get_snapshot()
# 按内存占用大小排序,取前 10 个
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
print(stat)
对比快照定位内存增长
如果程序运行一段时间后内存变高,可以对比前后两次快照,直接看出哪些代码新分配了最多内存。
import tracemalloc
tracemalloc.start()
snapshot1 = tracemalloc.get_snapshot()
# 模拟内存增长操作
cache = []
for _ in range(5):
cache.append(' ' * 10**6)
snapshot2 = tracemalloc.get_snapshot()
# 对比两个快照,显示差异最大的 5 处
stats = snapshot2.compare_to(snapshot1, 'lineno')
for stat in stats[:5]:
print(stat)
解读统计结果
statistics('lineno') 按文件行号统计,statistics('filename') 按文件统计,statistics('traceback') 则展示完整调用栈。输出中的 size 表示占用字节数,count 表示分配次数。
| 统计维度 | 适用场景 |
|---|---|
| lineno | 快速看某行代码占了多少内存 |
| filename | 看哪个文件整体占用最高 |
| traceback | 需要完整调用链时 |
实际排查建议
在真实项目中,可以写一个定时任务或者在请求处理前后打快照。如果发现某次接口调用后内存明显上涨且未回落,就用 compare_to 找到对应代码行,检查是否存在全局变量缓存、未关闭的资源或循环引用等问题。
注意:tracemalloc 只跟踪 Python 层内存分配,C 扩展分配的内存不会体现在统计中。
关闭跟踪
排查结束后调用 tracemalloc.stop() 停止跟踪,避免带来额外性能开销。
import tracemalloc tracemalloc.start() # 排查动作 tracemalloc.stop()
Pythontracemalloc内存泄漏修改时间:2026-07-30 22:42:22