转自:https://my.oschina.net/markco/blog/601773 meliae是一个python进程内存占用监控、分析工具,它的安装需要依赖pyrex包。 一、安装: 安装python内存分析工具sudo pip install cythonsudo pip install meliae 二、使用: meliae会把某个时刻的内存给dump到一个文件中,然后再对该文件进行分析,当我们的某个python程序占用内存很大,可能有内存泄露发生时,可以使用该工具来进行检测分析。 scanner.dump_all_objects() om = loader.load() om.compute_parents() om.collapse_instance_dicts() print om.summarize() 1、在需要dump内存的地方,写上以下代码即可: from meliae import scanner scanner.dump_all_objects('/opt/log/dump.txt') 这样,我们就可以把当前的内存Objects都导出到了dump.txt。 2、然后再进行分析: from meliae import loader #加载dump文件 om = loader.load('/opt/log/dump.txt') #计算各Objects的引用关系 om.compute_parents() #去掉各对象Instance的_dict_属性 om.collapse_instance_dicts() #分析内存占用情况 print om.summarize() 3、我的某个python程序分析结果如下: Total 333015 objects, 188 types, Total size = 52.8MiB (55414199 bytes) Index Count % Size % Cum Max Kind 0 10620 3 18096480 32 32 1704 POP3ClientProtocol 1 133004 39 6290033 11 44 31457 str 2 10628 3 5866656 10 54 552 Connector 3 10628 3 5866656 10 65 552 POP3ClientFactory ……. 从上面可以看到,共有333015个对象,占用了52M的内存 其中,共有10620个POP3ClientProtocol对象实例,占用了32%约18M的内存 最大的对象也只占用了1.7K的内存,但由于对象很多,所以最终它占用的内存就很大了 那么,我们就大概知道了内存泄露的地方,就是这个POP3ClientProtocol对象,在使用完成之后,没有释放造成的 我们还可以继续分析某个对象,找出它的引用关系 #得到所有的POP3ClientProtocol对象 p = om.get_all('POP3ClientProtocol') #查看第一个对象 p[0] 说明该对象的地址为2803894924,占用了1.7K内存,引用了51个对象,它被1个对象所引用 >>>POP3ClientProtocol(2803894924 1704B 51refs 1par) #可以查看该对象的所有引用 p[0].c >>>[str(3079323384 33B 10647par 'popuserid'), str(2814724096 45B 1par 'fuzimiao2000@sohu.com'), str(3079036128 31B 10624par 'mailnum'), int(165090672 12B 29par '75'), #查看谁引用了这个对象 p[0].p >>>[POP3ClientFactory(2803893100 552B 15refs 3par)] 聚合全网技术文章,根据你的阅读喜好进行个性推荐 下载 APP ©开源中国(OSChina.NET) 工信部 开源软件推进联盟 指定官方社区 深圳市奥思网络科技有限公司版权所有 粤ICP备12009483号-3 相关文章: