Chinaunix首页 | 论坛 | 博客

运维开发yaofang.blog.chinaunix.net

职业目标:专注运维开发领域,努力做好运维工具提高运维效率!我的QQ:1047984536。欢迎交流技术。

  • 博客访问: 9177265
  • 博文数量: 2159
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21595
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2159)

文章存档

2012年(2)

2011年(20)

2010年(1196)

2009年(1011)

2008年(172)

分类: Python/Ruby

2010-07-19 22:20:38

meliae是一个python进程内存占用监控、分析工具,它的安装需要依赖pyrex

meliae会把某个时刻的内存给dump到一个文件中,然后再对该文件进行分析

当我们的某个python程序占用内存很大,可能有内存泄露发生时,可以使用该工具来进行检测分析

安装和使用用都比较简单,在需要dump内存的地方,写上以下代码即可:

折叠复制代码
  1. from meliae import scanner
  2. scanner.dump_all_objects('/opt/log/dump.txt')

这样,我们就可以把当前的内存Objects都导出到了dump.txt,然后再进行分析

折叠复制代码
  1. from meliae import loader
  2. #加载dump文件
  3. om = loader.load('/opt/log/dump.txt')
  4. #计算各Objects的引用关系
  5. om.compute_parents()
  6. #去掉各对象Instance的_dict_属性
  7. om.collapse_instance_dicts()
  8. #分析内存占用情况
  9. om.summarize()

我的某个python程序分析结果如下:

折叠复制代码
  1. Total 333015 objects, 188 types, Total size = 52.8MiB (55414199 bytes)
  2. Index Count % Size % Cum Max Kind
  3. 0 10620 3 18096480 32 32 1704 POP3ClientProtocol
  4. 1 133004 39 6290033 11 44 31457 str
  5. 2 10628 3 5866656 10 54 552 Connector
  6. 3 10628 3 5866656 10 65 552 POP3ClientFactory
  7. .......

从上面可以看到,共有333015个对象,占用了52M的内存

其中,共有10620个POP3ClientProtocol对象实例,占用了32%约18M的内存

最大的对象也只占用了1.7K的内存,但由于对象很多,所以最终它占用的内存就很大了

那么,我们就大概知道了内存泄露的地方,就是这个POP3ClientProtocol对象,在使用完成之后,没有释放造成的

我们还可以继续分析某个对象,找出它的引用关系

折叠复制代码
  1. #得到所有的POP3ClientProtocol对象  
  2. p = om.get_all('POP3ClientProtocol')  
  3. #查看第一个对象  
  4. p[0]  
  5. 说明该对象的地址为2803894924,占用了1.7K内存,引用了51个对象,它被1个对象所引用  
  6. >>>POP3ClientProtocol(2803894924 1704B 51refs 1par)  
  7. #可以查看该对象的所有引用  
  8. p[0].c
  9. >>>[str(3079323384 33B 10647par 'popuserid'), str(2814724096 45B 1par 'fuzimiao2000@sohu.com'), str(3079036128 31B 10624par 'mailnum'), int(165090672 12B 29par '75'),
  10. #查看谁引用了这个对象
  11. p[0].p
  12. >>>[POP3ClientFactory(2803893100 552B 15refs 3par)]
阅读(2233) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册