1秒登錄
轉自:https://my.oschina.net/markco/blog/601773
一、安裝:
安裝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)]
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。