[轉] python運行時內存分析工具meliae


轉自:https://my.oschina.net/markco/blog/601773

利用meliae來監控python進程的內存占用情況 

meliae是一個python進程內存占用監控、分析工具,它的安裝需要依賴pyrex包。

一、安裝:

安裝python內存分析工具
sudo pip install cython
sudo 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)]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM