這篇文章運用簡單易懂的例子給大家介紹為什么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會內存泄露就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。