tracemalloc 模块是一个用于对 python 已申请的内存块进行debug的工具。它能提供以下信息:
-
定位对象分配内存的位置
-
按文件、按行统计python的内存块分配情况: 总大小、块的数量以及块平均大小。
-
对比两个内存快照的差异,以便排查内存泄漏
显示前10项
显示内存分配最多的10个文件:
import tracemalloc
tracemalloc.start()
# --- 业务代码 start ---
n = 10000000
s = 0
for i in range(1, n):
s *= i
# --- 业务代码 end ---
snapshot = tracemalloc.take_snapshot() # 内存摄像
top_stats = snapshot.statistics('lineno') # 内存占用数据获取
print('[Top 10]')
for stat in top_stats[:10]: # 打印占用内存最大的10个子进程
print(stat)
# [Top 10]
# D:/MyPython/tracemalloc/demo.py:5: size=576 B, count=1, average=576 B
# D:/MyPython/tracemalloc/demo.py:7: size=28 B, count=1, average=28 B
TOP1:代码第五行占用内存大小576B
计算差异
获取两个快照并显示差异:
import tracemalloc
tracemalloc.start()
snapshot0 = tracemalloc.take_snapshot() # 第一张快照
# --- 业务代码 start ---
n = 10000000
s = 0
for i in range(1, n):
s *= i
# --- 业务代码 end ---
snapshot1 = tracemalloc.take_snapshot() # 第二张快照
top_stats = snapshot1.compare_to(snapshot0, 'lineno') # 快照对比
print('[Top 10 differences]')
for stat in top_stats[:10]:
print(stat)
# [Top 10 differences]
# D:/MyPython/tracemalloc/demo.py:27: size=576 B (+576 B), count=1 (+1), average=576 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:397: size=88 B (+88 B), count=2 (+2), average=44 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:534: size=48 B (+48 B), count=1 (+1), average=48 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:291: size=40 B (+40 B), count=1 (+1), average=40 B
# D:/MyPython/tracemalloc/demo.py:31: size=28 B (+28 B), count=1 (+1), average=28 B
TOP1:代码第27行占用内存大小增加了576B
参考:
tracemalloc --- 跟踪内存分配 — Python 3.7.13 文档
https://docs.python.org/zh-cn/3.7/library/tracemalloc.html#module-tracemalloc
python3使用tracemalloc追踪mmap内存变化 - DECHIN - 博客园
https://www.cnblogs.com/dechinphy/p/mmap.html