tracemalloc 模块是一个用于对 python 已申请的内存块进行debug的工具。它能提供以下信息:
定位对象分配内存的位置
按文件、按行统计python的内存块分配情况: 总大小、块的数量以及块平均大小。
对比两个内存快照的差异,以便排查内存泄漏
显示内存分配最多的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