Python实现内存泄露排查的示例详解
2023-01-21 10:37:11 来源:易采站长站 作者:
一般情况下只有需要长期运行的项目才会去关注内存的增长情况,即使是很小部分的内存泄露经过长期的运行仍然会产生很大的隐患。python本身也是支持垃圾的自动回收的,但是在特定的情况下也是会出现内存泄露的问...
一般情况下只有需要长期运行的项目才会去关注内存的增长情况,即使是很小部分的内存泄露经过长期的运行仍然会产生很大的隐患。
python本身也是支持垃圾的自动回收的,但是在特定的情况下也是会出现内存泄露的问题的。
比如对于很多全局的列表(list)/字典(dict)等对象在经过不断的数据赋值而没有进行手动回收,或者某些对象被不停的循环引用而不能及时的进行回收等都会产生内存泄露的情况。
一般在python代码块的调试过程中会使用memory-profiler、filprofiler、objgraph等三种方式进行辅助分析,今天这里主要介绍使用objgraph对象提供的函数接口来进行内存泄露的分析。
objgraph是python的非标准模块,因此需要使用pip的方式安装一下。
pipinstallobjgraph
更多详细的介绍可以访问下面的官方地址进行查看。
https://mg.pov.lt/objgraph/
接下来就可以直接将objgraph导入到我们的代码块中进行使用了。
#Importingtheobjgraphmoduleandrenamingittograph. importobjgraphasgraph
这里初始化一组字典类型的数据对象。
dict_={ '姓名':['Python','Java','Scala'], '年龄':['21','22','19'] }
通过objgraph.count()函数,可以统计出GC中的dict_对象的数目是多少。
#Countingthenumberofdict_objectsintheGC. print(graph.count(dict_))
和objgraph.count()函数对应的是可以使用by_type返回该对象在GC中的列表,若是GC返回的为空的列表说明已经被回收了。
#Returningalistofdict_objectsintheGC. print(graph.by_type(dict_))
在统计内存泄露时比较好用的函数就是graph.show_growth()函数,可以统计自上次调用以来增加得最多的对象。
#Showingthegrowthofobjectsinthememorysincethelasttimeitwascalled. print(graph.show_growth()) #function3013+3013 #tuple1463+1463 #dict1417+1417 #wrapper_descriptor1178+1178 #ReferenceType883+883 #method_descriptor814+814 #builtin_function_or_method794+794 #getset_descriptor514+514 #type463+463 #list436+436 #None
可以根据返回结果中的对象每次增加的数量来判断内存泄露的相关情况。
还有一个比较常用的分析函数就是graph.show_most_common_types(),可以按照从大到小的方式列出对象实例比较多的情况。
#Showingthemostcommontypesofobjectsinthememory. print(graph.show_most_common_types()) #function3013 #tuple1463 #dict1417 #wrapper_descriptor1178 #ReferenceType883 #method_descriptor814 #builtin_function_or_method794 #getset_descriptor514 #type463 #list436 #None
最后一个比较使用函数就是show_backrefs函数,使用它可以分析出内存泄露的原因是什么。
它会生成一张有关objs的引用图,可以看出对象为什么不释放?只是调用该函数时的参数比较多,下面是该函数的接口。
#defshow_backrefs(objs,max_depth=3,extra_ignore=(),filter=None,too_many=10, #highlight=None,filename=None,extra_info=None, #refcounts=False,shortnames=True,output=None, #extra_node_attrs=None):
我们还是和上面一样使用dict_作为对象进行分析。
#Showingthebackreferencesofthedict_object. graph.show_backrefs(dict_)
执行完成后dot类型的图片已经生成了,发现出现了下面的错误,意思是没有发现支持dot的图像组件。
#GraphwrittentoC:\Users\86159\AppData\Local\Tempobjgraph-dkqm85f0.dot(4nodes) #Graphviewer(xdot)andimagerenderer(dot)notfound,notdoinganythingelse
可以使用pip的方式分别安装graphviz xdot,这两个python的非标准模块。
pipinstallgraphvizxdot
若是查看.dot决策树图像可以使用graphviz工具,可以到下面地址进行下载安装。
https://graphviz.org/download/
安装完成后配置环境变量,然后重启开发工具(这里使用的是pycharm)即可。
到此这篇关于Python实现内存泄露排查的示例详解的文章就介绍到这了,更多相关Python内存泄露排查内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
如有侵权,请发邮件到 [email protected]
最新图文推荐
相关文章
-
Pycharm永久激活教程(适用jetbrains全系列产品:Pycharm、Idea、WebStor
一.激活前注意事项 1.PyCharm尽量在官网下载:https://www.jetbrains.com/pycharm/download/ 2.本教程适用于PyCharm所有版本 3.本教程适用于jetbrains全系列产品(Pycharm、Idea、WebStorm、phpstorm、CLion、Rub2020-06-26
-
python+opencv+caffe+摄像头做目标检测的实例代码
首先之前已经成功的使用Python做图像的目标检测,这回因为项目最终是需要用摄像头的, 所以实现摄像头获取图像,并且用Python调用CAFFE接口来实现目标识别 首先是摄像头请选择支持2020-06-22
-
pycharm中导入模块错误时提示Try to run this command from the system ter
pycharm中导入模块错误时,提示:Try to run this command from the system terminal. Make sure that you use the correct version of ‘pip' installed for your Python interpreter located atpycharm工作路径。 安装好pycharm,而且2020-03-26
-
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
背景说明 感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的。没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来。简单介绍下本次2020-06-19