1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题
1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者list对象里添加新的对象, 而又没有即时释放,就会导致这些对象占用的内存越来越多,从而造成内存泄漏。另外,对象的交叉引用也会造成内存无法释放的问题。
2 那么如果在Python里发现了内存泄漏的问题,如何去查找呢?本文讲述了如何使用objgraph这个工具来进行内存泄漏的查找
3 先下载objgraph这个工具:
3.1 objgraph
http://mg.pov.lt/objgraph/
3.2 https://pypi.python.org/pypi/objgraph
3.3 pythonsetup.py install 进行安装
4 安装graphviz
4.1 这是一个将图结构转化成png图片表示的工具,有了它,就可以通过对象的引用关系,为最终找到内存泄漏的对方提供最好的指导
4.2 windows版下载地址:
http://www.graphviz.org/Download_windows.php
4.3 ubuntu下安装:
sudo apt-get install graphviz
5 这个工具还可以利用graphviz这个工具来生成可视化的对象引用关系图,但是根据个人的使用经验,在对象比较多的时候,生成的图往往会比较大
6 如何查找产生泄漏的对象:
6.1 objgraph.show_growth()
这个函数可以说是这个工具中最有用的函数了
作用是输出增长的对象。
6.2 先从一个例子看看怎样用:
import os
import gc
import objgraph
gc.collect()
print'====================================='
objgraph.show_growth()
a = []
print'====================================='
objgraph.show_growth()
a.append([1,2,3])
print'====================================='
objgraph.show_growth()
b = ['a','b','c']
del b
print'===================================='
objgraph.show_growth()
6.3 输出如下:
=====================================
wrapper_descriptor 1020 +1020
function 975 +975
builtin_function_or_method 615 +615
dict 414 +414

本文介绍了Python中内存泄漏的问题,以及如何使用objgraph工具进行内存泄漏的查找和定位。通过示例展示了如何通过show_growth函数监控对象增长,并通过by_type、find_backref_chain和show_chain等功能进一步分析和定位内存泄漏的源头。
最低0.47元/天 解锁文章
1756

被折叠的 条评论
为什么被折叠?



