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