日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)Python教程:Python中的垃圾回收機(jī)制是什么

公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出沂南免費(fèi)做網(wǎng)站回饋大家。

一、寫在前面:

我們都知道python一種面向?qū)ο蟮哪_本語言,對(duì)象是Python中非常重要的一個(gè)概念。在Python中數(shù)字是對(duì)象,字符串是對(duì)象,任何事物都是對(duì)象,而它們的核心就是一個(gè)結(jié)構(gòu)體--PyObject。

typedef struct_object{
  int ob_refcnt;
  struct_typeobject *ob_type;
}PyObject;

PyObject是每個(gè)對(duì)象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。

二、垃圾回收機(jī)制

垃圾回收(Garbage Collection)大家應(yīng)該多多少少都聽過,但是什么是垃圾回收呢?我們這里說的垃圾回收肯定不是把垃圾丟進(jìn)垃圾桶?,F(xiàn)在的高級(jí)語言Java,C#等,都采用了垃圾回收機(jī)制,而不再是C,C++里用戶自己管理維護(hù)內(nèi)存的方式,自己管理內(nèi)存是很自由,但是可能出現(xiàn)內(nèi)存泄漏,懸空指針等問題。而垃圾回收機(jī)制作為現(xiàn)代編程語言的自動(dòng)內(nèi)存管理機(jī)制,專注于兩件事:1. 找到內(nèi)存中無用的垃圾資源 2. 清除這些垃圾并把內(nèi)存讓出來給其他對(duì)象使用。

相關(guān)推薦:《Python視頻教程》

三、Python中的垃圾回收

在Python中,垃圾回收機(jī)制主要是以引用計(jì)數(shù)為主要手段,以標(biāo)記清除和分代回收機(jī)制作為輔助手段實(shí)現(xiàn)的。

1、引用計(jì)數(shù)

通過前面的介紹,我們已經(jīng)知道PyObject是每個(gè)對(duì)象必有的內(nèi)容,而當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少,當(dāng)引用計(jì)數(shù)為0時(shí),該對(duì)象生命就結(jié)束了。

我們來看看引用計(jì)數(shù)+1的情況有什么:

(1)對(duì)象被創(chuàng)建:

這里實(shí)際上123這個(gè)對(duì)象并沒有在內(nèi)存中新建,因?yàn)樵赑ython啟動(dòng)解釋器的時(shí)候會(huì)創(chuàng)建一個(gè)小整數(shù)池,在-5~256之間的整數(shù)對(duì)象會(huì)被自動(dòng)加載到內(nèi)存中等待調(diào)用。因此a=123是對(duì)123這個(gè)整數(shù)對(duì)象增加了一次引用。而456是不在整數(shù)池里的,需要?jiǎng)?chuàng)建對(duì)象,那么最后的引用次數(shù)是2呢?因?yàn)閟ys.getrefcount(b)也是一次引用。

(2)對(duì)象被引用:

每一次賦值操作都會(huì)增加數(shù)據(jù)的引用次數(shù),要記住引用的變量a、b、c指向的是數(shù)據(jù)456,而不是變量本身。

(3)對(duì)象作為參數(shù)傳遞到函數(shù)中:

這里可以很明顯看到在被傳遞到函數(shù)中后,引用計(jì)數(shù)增加了1。

(4)對(duì)象作為元素儲(chǔ)存到容器中:

這里我們?cè)趧?chuàng)建對(duì)象之后,把a(bǔ)分別添加到了一個(gè)列表和一個(gè)元組中,引用計(jì)數(shù)都增加了。

雖然引用計(jì)數(shù)必須在每次分配合釋放內(nèi)存的時(shí)候加入管理引用計(jì)數(shù)的操作,然而與其他垃圾回收技術(shù)相比,引用計(jì)數(shù)有一個(gè)優(yōu)點(diǎn),那就是“實(shí)時(shí)性”,如果這個(gè)對(duì)象沒有引用,內(nèi)存就直接釋放了,而其他垃圾回收技術(shù)必須在某種特殊條件下才能進(jìn)行無效內(nèi)存的回收。但是引用計(jì)數(shù)帶來的維護(hù)引用計(jì)數(shù)的額外操作和Python中進(jìn)行的內(nèi)存分配和釋放,引用的賦值次數(shù)成正比的。除此之外,引用計(jì)數(shù)機(jī)制的還有一個(gè)軟肋--無法解決循環(huán)引用帶來的問題。循環(huán)引用可以使一種引用對(duì)象的引用計(jì)數(shù)不為0,然而這些對(duì)象實(shí)際上并沒有被任何外部對(duì)象所引用,它們之間只是相互引用,這意味著這組對(duì)象所占用的內(nèi)存空間是應(yīng)該被回收的,但是由于循環(huán)引用導(dǎo)致的引用計(jì)數(shù)不為0,所以這組對(duì)象所占用的內(nèi)存空間永遠(yuǎn)不會(huì)被釋放。如下,list1與list2相互引用,如果不存在其他對(duì)象對(duì)它們的引用,list1與list2的引用計(jì)數(shù)也仍然為1,所占用的內(nèi)存永遠(yuǎn)無法被回收,這將是致命的。

list1 = []
list2 = []
list1.append(list2)
list2.append(list1)

2、標(biāo)記清除

標(biāo)記清除(Mark—Sweep)算法是一種基于追蹤回收(tracing GC)技術(shù)實(shí)現(xiàn)的垃圾回收算法。它分為兩個(gè)階段:第一階段是標(biāo)記階段,GC會(huì)把所有的活動(dòng)對(duì)象打上標(biāo)記,第二階段是把那些沒有標(biāo)記的對(duì)象非活動(dòng)對(duì)象進(jìn)行回收。

對(duì)象之間通過引用(指針)連在一起,構(gòu)成一個(gè)有向圖,對(duì)象構(gòu)成這個(gè)有向圖的節(jié)點(diǎn),而引用關(guān)系構(gòu)成這個(gè)有向圖的邊。從根對(duì)象(root object)出發(fā),沿著有向邊遍歷對(duì)象,可達(dá)的(reachable)對(duì)象標(biāo)記為活動(dòng)對(duì)象,不可達(dá)的對(duì)象就是要被清除的非活動(dòng)對(duì)象。根對(duì)象就是全局變量、調(diào)用棧、寄存器。 

        

在上圖中,可以從程序變量直接訪問塊1,并且可以間接訪問塊2和3。程序無法訪問塊4和5。第一步將標(biāo)記塊1,并記住塊2和3以供稍后處理。第二步將標(biāo)記塊2,第三步將標(biāo)記塊3,但不記得塊2,因?yàn)樗驯粯?biāo)記。掃描階段將忽略塊1,2和3,因?yàn)樗鼈円驯粯?biāo)記,但會(huì)回收塊4和5。

標(biāo)記清除算法作為Python的輔助垃圾收集技術(shù),主要處理的是一些容器對(duì)象,比如list、dict、tuple等,因?yàn)閷?duì)于字符串、數(shù)值對(duì)象是不可能造成循環(huán)引用問題。Python使用一個(gè)雙向鏈表將這些容器對(duì)象組織起來。不過,這種簡(jiǎn)單粗暴的標(biāo)記清除算法也有明顯的缺點(diǎn):清除非活動(dòng)的對(duì)象前它必須順序掃描整個(gè)堆內(nèi)存,哪怕只剩下小部分活動(dòng)對(duì)象也要掃描所有對(duì)象。

3、分代回收

分代回收是建立在標(biāo)記清除技術(shù)基礎(chǔ)之上的,是一種以空間換時(shí)間的操作方式。

Python將內(nèi)存根據(jù)對(duì)象的存活時(shí)間劃分為不同的集合,每個(gè)集合稱為一個(gè)代,Python將內(nèi)存分為了3“代”,分別為年輕代(第0代)、中年代(第1代)、老年代(第2代),他們對(duì)應(yīng)的是3個(gè)鏈表,它們的垃圾收集頻率與對(duì)象的存活時(shí)間的增大而減小。新創(chuàng)建的對(duì)象都會(huì)分配在年輕代,年輕代鏈表的總數(shù)達(dá)到上限時(shí),Python垃圾收集機(jī)制就會(huì)被觸發(fā),把那些可以被回收的對(duì)象回收掉,而那些不會(huì)回收的對(duì)象就會(huì)被移到中年代去,依此類推,老年代中的對(duì)象是存活時(shí)間最久的對(duì)象,甚至是存活于整個(gè)系統(tǒng)的生命周期內(nèi)。


網(wǎng)頁題目:創(chuàng)新互聯(lián)Python教程:Python中的垃圾回收機(jī)制是什么
路徑分享:http://www.5511xx.com/article/ccshcgd.html