最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python内存泄露的原因是什么

    正文概述    2020-07-29   400

    python内存泄露的原因是什么

    像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题。在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者list对象里添加新的对象, 而又没有即时释放,就会导致这些对象占用的内存越来越多,从而造成内存泄漏。另外,对象的交叉引用也会造成内存无法释放的问题。

    那么如果在Python里发现了内存泄漏的问题,如何去查找呢?本文讲述了如何使用objgraph这个工具来进行内存泄漏的查找。

    1、先下载objgraph这个工具:http://mg.pov.lt/objgraph/

    https://pypi.python.org/pypi/objgraph

    pythonsetup.py install,进行安装。

    2、安装graphviz

    这是一个将图结构转化成png图片表示的工具,有了它,就可以通过对象的引用关系,为最终找到内存泄漏的对方提供最好的指导。

    windows版下载地址:http://www.graphviz.org/Download_windows.php

    ubuntu下安装:

    sudo apt-get install graphviz

    这个工具还可以利用graphviz这个工具来生成可视化的对象引用关系图,但是根据个人的使用经验,在对象比较多的时候,生成的图往往会比较大。

    3、如何查找产生泄漏的对象:

    objgraph.show_growth()

    这个函数可以说是这个工具中最有用的函数了,作用是输出增长的对象。

    4、先从一个例子看看怎样用:

    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()

    输出如下:

    =====================================
    wrapper_descriptor            1020    +1020
    function                      975      +975
    builtin_function_or_method     615      +615
    dict                          414      +414
    method_descriptor             391      +391
    weakref                       286      +286
    member_descriptor             192      +192
    tuple                         181      +181
    list                          159      +159
    getset_descriptor             132      +132
    =====================================
    wrapper_descriptor     1031      +11
    member_descriptor      196        +4
    getset_descriptor      135        +3
    weakref               289        +3
    dict                  417        +3
    list                  160        +1
    =====================================
    list      161       +1
    ====================================

    从打印可以看出:

    第一次调用show_growth时,实际上打印出来的是当前所有对象的总数

    第二次调用show_growth时,可以看到list对象增长了1,这正是a = []所创建的,其它增长的对象应该是在第一次调用show_growth函数内部产生的。

    当调用a.append([1,2,3])后,再调用show_growth,又发现list对象增长了1个。

    再接下来,调用b =['a','b','c'] 后又马上调用del b把这个对象删除,再调用show_growth时对象没有增长。

    从上面的例子来看,show_growth可以准确的打印出增长的对象以及增长的个数。

    在实际情况中,通常为了查找出哪些对象有内存泄漏,一般用每隔一段时间调用一次show_growth的方法,然后找出对象的个数一直在增长的对象,这些对象即为发生了内存泄漏的对象。

    说明:为了使show_growth的输出更为准确,在调用show_growth时,最好调用gc.collect()进行一次垃圾对象的回收。

    python学习网,大量的免费python视频教程,欢迎在线学习!


    起源地下载网 » python内存泄露的原因是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元