為什么python會(huì)內(nèi)存泄露-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

霍城網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,霍城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為霍城成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的霍城做網(wǎng)站的公司定做!

這篇文章運(yùn)用簡單易懂的例子給大家介紹為什么python會(huì)內(nèi)存泄露,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

像Java程序一樣,雖然Python本身也有垃圾回收的功能,但是同樣也會(huì)產(chǎn)生內(nèi)存泄漏的問題。在Python程序里,內(nèi)存泄漏是由于一個(gè)長期持有的對(duì)象不斷的往一個(gè)dict或者list對(duì)象里添加新的對(duì)象, 而又沒有即時(shí)釋放,就會(huì)導(dǎo)致這些對(duì)象占用的內(nèi)存越來越多,從而造成內(nèi)存泄漏。另外,對(duì)象的交叉引用也會(huì)造成內(nèi)存無法釋放的問題。

那么如果在Python里發(fā)現(xiàn)了內(nèi)存泄漏的問題,如何去查找呢?本文講述了如何使用objgraph這個(gè)工具來進(jìn)行內(nèi)存泄漏的查找。

1、先下載objgraph這個(gè)工具:http://mg.pov.lt/objgraph/

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

pythonsetup.py install,進(jìn)行安裝。

2、安裝graphviz

這是一個(gè)將圖結(jié)構(gòu)轉(zhuǎn)化成png圖片表示的工具,有了它,就可以通過對(duì)象的引用關(guān)系,為最終找到內(nèi)存泄漏的對(duì)方提供最好的指導(dǎo)。

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

ubuntu下安裝:

sudo apt-get install graphviz

這個(gè)工具還可以利用graphviz這個(gè)工具來生成可視化的對(duì)象引用關(guān)系圖,但是根據(jù)個(gè)人的使用經(jīng)驗(yàn),在對(duì)象比較多的時(shí)候,生成的圖往往會(huì)比較大。

3、如何查找產(chǎn)生泄漏的對(duì)象:

objgraph.show_growth()

這個(gè)函數(shù)可以說是這個(gè)工具中最有用的函數(shù)了,作用是輸出增長的對(duì)象。

4、先從一個(gè)例子看看怎樣用:

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í),實(shí)際上打印出來的是當(dāng)前所有對(duì)象的總數(shù)

第二次調(diào)用show_growth時(shí),可以看到list對(duì)象增長了1,這正是a = []所創(chuàng)建的,其它增長的對(duì)象應(yīng)該是在第一次調(diào)用show_growth函數(shù)內(nèi)部產(chǎn)生的。

當(dāng)調(diào)用a.append([1,2,3])后,再調(diào)用show_growth,又發(fā)現(xiàn)list對(duì)象增長了1個(gè)。

再接下來,調(diào)用b =['a','b','c'] 后又馬上調(diào)用del b把這個(gè)對(duì)象刪除,再調(diào)用show_growth時(shí)對(duì)象沒有增長。

從上面的例子來看,show_growth可以準(zhǔn)確的打印出增長的對(duì)象以及增長的個(gè)數(shù)。

在實(shí)際情況中,通常為了查找出哪些對(duì)象有內(nèi)存泄漏,一般用每隔一段時(shí)間調(diào)用一次show_growth的方法,然后找出對(duì)象的個(gè)數(shù)一直在增長的對(duì)象,這些對(duì)象即為發(fā)生了內(nèi)存泄漏的對(duì)象。

說明:為了使show_growth的輸出更為準(zhǔn)確,在調(diào)用show_growth時(shí),最好調(diào)用gc.collect()進(jìn)行一次垃圾對(duì)象的回收。

關(guān)于為什么python會(huì)內(nèi)存泄露就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)站標(biāo)題:為什么python會(huì)內(nèi)存泄露-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)