meliae内存分析-基本用法
2014年2月24日 12:58
python的内存分析工具meliae,挺好用的.
示例
1.记录程序的内存使用信息
import time
# 此处是可能发生内存泄露的地方
def main():
pass
if __name__ == '__main__':
# 通过循环执行,将泄露的内存积累放大
while True:
main()
time.sleep(10)
# 记录每次执行完后占用的内存
from meliae import scanner
scanner.dump_all_objects('mem_dump%s' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
2.查看占用的内存大小
from meliae import loader
om = loader.load('mem_dump2014-02-2022-34-43')
om.summarize()
具体分析引用关系太麻烦,以上是个人喜欢的方法:
用循环将泄露的内存累积放大. 然后记录每次执行完后占用的内存.
查看占用内存大小. 再比较每次的内存大小,即可知道是否发生泄露.
至于内存泄露的地方,则用排除法,重复上述过程,定位泄露地点.
基本用法
- 获取进程的内存信息
import time
from meliae import scanner
scanner.dump_all_objects('mem_dump%s' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
- 查看占用内存
from meliae import loader
#加载dump文件
om = loader.load('mem_dump2014-02-2022-34-43')
#分析内存占用情况
om.summarize()
- 输出样例
Total 40335 objects, 125 types, Total size = 6.5MiB (6768944 bytes)
Index Count % Size % Cum Max Kind
0 1245 3 1792824 26 26 98584 dict
1 18560 46 1568824 23 49 12479 str
2 226 0 730272 10 60 12624 module
3 559 1 505336 7 67 904 type
4 3573 8 457344 6 74 128 code
5 3759 9 451080 6 81 120 function
6 2506 6 189840 2 84 576 tuple
7 1383 3 163768 2 86 4280 list
8 1303 3 104240 1 88 80 wrapper_descriptor
9 895 2 78760 1 89 88 weakref
10 942 2 67824 1 90 72 builtin_function_or_method
11 198 0 66928 0 91 8424 set
12 388 0 65136 0 92 1552 unicode
13 807 2 58104 0 93 72 method_descriptor
14 50 0 56000 0 93 1120 OracleDB
15 1680 4 40320 0 94 24 int
16 36 0 36768 0 95 1192 StgDict
17 446 1 32112 0 95 72 getset_descriptor
18 87 0 29928 0 95 344 WeakSet
19 395 0 28440 0 96 72 member_descriptor
字段说明
Index : 行索引号
Count : 该类型的对象总数
%(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
Size : 该类型的对象总字节数
%(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
Cum : 累积行索引后的%(Size)
Max : 该类型的对象中,最大者的字节数
Kind : 类型
- 对象及引用关系
个人不喜欢用这个
#得到所有的OracleDB对象
p = om.get_all('OracleDB')
#查看第一个对象
p[0]
#可以查看该对象的所有引用
p[0].c
#查看谁引用了这个对象
p[0].p