溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么python會內存泄露

發布時間:2020-08-26 11:11:06 來源:億速云 閱讀:309 作者:Leah 欄目:編程語言

這篇文章運用簡單易懂的例子給大家介紹為什么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會內存泄露就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女