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