meliae内存分析-基本用法
2014年2月24日 12:58
python的内存分析工具meliae,挺好用的.
示例
1.记录程序的内存使用信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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.查看占用的内存大小
1 2 3 | from meliae import loader om = loader.load( 'mem_dump2014-02-2022-34-43' ) om.summarize() |
具体分析引用关系太麻烦,以上是个人喜欢的方法:
用循环将泄露的内存累积放大. 然后记录每次执行完后占用的内存.
查看占用内存大小. 再比较每次的内存大小,即可知道是否发生泄露.
至于内存泄露的地方,则用排除法,重复上述过程,定位泄露地点.
基本用法
- 获取进程的内存信息
1 2 3 | import time from meliae import scanner scanner.dump_all_objects( 'mem_dump%s' % time.strftime( "%Y-%m-%d %H:%M:%S" , time.localtime())) |
- 查看占用内存
1 2 3 4 5 | from meliae import loader #加载dump文件 om = loader.load( 'mem_dump2014-02-2022-34-43' ) #分析内存占用情况 om.summarize() |
- 输出样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 : 类型
- 对象及引用关系
个人不喜欢用这个
1 2 3 4 5 6 7 8 | #得到所有的OracleDB对象 p = om.get_all( 'OracleDB' ) #查看第一个对象 p[ 0 ] #可以查看该对象的所有引用 p[ 0 ].c #查看谁引用了这个对象 p[ 0 ].p |