創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
霍城網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,霍城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為霍城成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的霍城做網(wǎng)站的公司定做!這篇文章運用簡單易懂的例子給大家介紹為什么python會內(nèi)存泄露,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
像Java程序一樣,雖然Python本身也有垃圾回收的功能,但是同樣也會產(chǎn)生內(nèi)存泄漏的問題。在Python程序里,內(nèi)存泄漏是由于一個長期持有的對象不斷的往一個dict或者list對象里添加新的對象, 而又沒有即時釋放,就會導致這些對象占用的內(nèi)存越來越多,從而造成內(nèi)存泄漏。另外,對象的交叉引用也會造成內(nèi)存無法釋放的問題。
那么如果在Python里發(fā)現(xiàn)了內(nèi)存泄漏的問題,如何去查找呢?本文講述了如何使用objgraph這個工具來進行內(nèi)存泄漏的查找。
1、先下載objgraph這個工具:http://mg.pov.lt/objgraph/
https://pypi.python.org/pypi/objgraph
pythonsetup.py install,進行安裝。
2、安裝graphviz
這是一個將圖結(jié)構(gòu)轉(zhuǎn)化成png圖片表示的工具,有了它,就可以通過對象的引用關(guān)系,為最終找到內(nèi)存泄漏的對方提供最好的指導。
windows版下載地址:http://www.graphviz.org/Download_windows.php
ubuntu下安裝:
sudo apt-get install graphviz
這個工具還可以利用graphviz這個工具來生成可視化的對象引用關(guān)系圖,但是根據(jù)個人的使用經(jīng)驗,在對象比較多的時候,生成的圖往往會比較大。
3、如何查找產(chǎn)生泄漏的對象:
objgraph.show_growth()
這個函數(shù)可以說是這個工具中最有用的函數(shù)了,作用是輸出增長的對象。
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 ====================================
從打印可以看出:
第一次調(diào)用show_growth時,實際上打印出來的是當前所有對象的總數(shù)
第二次調(diào)用show_growth時,可以看到list對象增長了1,這正是a = []所創(chuàng)建的,其它增長的對象應(yīng)該是在第一次調(diào)用show_growth函數(shù)內(nèi)部產(chǎn)生的。
當調(diào)用a.append([1,2,3])后,再調(diào)用show_growth,又發(fā)現(xiàn)list對象增長了1個。
再接下來,調(diào)用b =['a','b','c'] 后又馬上調(diào)用del b把這個對象刪除,再調(diào)用show_growth時對象沒有增長。
從上面的例子來看,show_growth可以準確的打印出增長的對象以及增長的個數(shù)。
在實際情況中,通常為了查找出哪些對象有內(nèi)存泄漏,一般用每隔一段時間調(diào)用一次show_growth的方法,然后找出對象的個數(shù)一直在增長的對象,這些對象即為發(fā)生了內(nèi)存泄漏的對象。
說明:為了使show_growth的輸出更為準確,在調(diào)用show_growth時,最好調(diào)用gc.collect()進行一次垃圾對象的回收。
關(guān)于為什么python會內(nèi)存泄露就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)站標題:為什么python會內(nèi)存泄露-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.rwnh.cn/article0/dsciio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、ChatGPT、響應(yīng)式網(wǎng)站、網(wǎng)站內(nèi)鏈、定制開發(fā)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容