麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Python > 正文

Python中的垃圾回收機(jī)制

2019-11-06 06:24:53
字體:
供稿:網(wǎng)友

Python中的垃圾回收機(jī)制是深入Python學(xué)習(xí)中需要了解的,查找資料時(shí)發(fā)現(xiàn)大多數(shù)講解Python的GC回收機(jī)制時(shí)對代碼深入講解的比較多,但是純原理深入講解的相對比較少,恰好看到了這個(gè)講述,就順手轉(zhuǎn)載了過來,用于自己加深原理理解,當(dāng)然別的還有更多的代碼示例的,可以跟著一起理解。

Python的GC模塊主要運(yùn)用了“引用計(jì)數(shù)”(reference counting)來跟蹤和回收垃圾。在引用計(jì)數(shù)的基礎(chǔ)上,還可以通過“標(biāo)記-清除”(mark and sweep)解決容器對象可能產(chǎn)生的循環(huán)引用的問題。通過“分代回收”(generation collection)以空間換取時(shí)間來進(jìn)一步提高垃圾回收的效率。

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

在Python中,大多數(shù)對象的生命周期都是通過對象的引用計(jì)數(shù)來管理的。從廣義上來講,引用計(jì)數(shù)也是一種垃圾收集機(jī)制,而且也是一種最直觀,最簡單的垃圾收集技術(shù)。

原理當(dāng)一個(gè)對象的引用被創(chuàng)建或者復(fù)制時(shí),對象的引用計(jì)數(shù)加1;當(dāng)一個(gè)對象的引用被銷毀時(shí),對象的引用計(jì)數(shù)減1;當(dāng)對象的引用計(jì)數(shù)減少為0時(shí),就意味著對象已經(jīng)沒有被任何人使用了,可以將其所占用的內(nèi)存釋放了。

雖然引用計(jì)數(shù)必須在每次分配和釋放內(nèi)存的時(shí)候加入管理引用計(jì)數(shù)的動(dòng)作,然而與其他主流的垃圾收集技術(shù)相比,引用計(jì)數(shù)有一個(gè)最大的有點(diǎn),即“實(shí)時(shí)性”,任何內(nèi)存,一旦沒有指向它的引用,就會(huì)立即被回收。而其他的垃圾收集計(jì)數(shù)必須在某種特殊條件下(比如內(nèi)存分配失敗)才能進(jìn)行無效內(nèi)存的回收。

引用計(jì)數(shù)機(jī)制執(zhí)行效率問題:引用計(jì)數(shù)機(jī)制所帶來的維護(hù)引用計(jì)數(shù)的額外操作與Python運(yùn)行中所進(jìn)行的內(nèi)存分配和釋放,引用賦值的次數(shù)是成正比的。而這點(diǎn)相比其他主流的垃圾回收機(jī)制,比如“標(biāo)記-清除”,“停止-復(fù)制”,是一個(gè)弱點(diǎn),因?yàn)檫@些技術(shù)所帶來的額外操作基本上只是與待回收的內(nèi)存數(shù)量有關(guān)。

如果說執(zhí)行效率還僅僅是引用計(jì)數(shù)機(jī)制的一個(gè)軟肋的話,那么很不幸,引用計(jì)數(shù)機(jī)制還存在著一個(gè)致命的弱點(diǎn),正是由于這個(gè)弱點(diǎn),使得俠義的垃圾收集從來沒有將引用計(jì)數(shù)包含在內(nèi),能引發(fā)出這個(gè)致命的弱點(diǎn)就是循環(huán)引用(也稱交叉引用)。

問題說明:

循環(huán)引用可以使一組對象的引用計(jì)數(shù)不為0,然而這些對象實(shí)際上并沒有被任何外部對象所引用,它們之間只是相互引用。這意味著不會(huì)再有人使用這組對象,應(yīng)該回收這組對象所占用的內(nèi)存空間,然后由于相互引用的存在,每一個(gè)對象的引用計(jì)數(shù)都不為0,因此這些對象所占用的內(nèi)存永遠(yuǎn)不會(huì)被釋放。比如:

a = []b = []a.append(b)b.append(b)PRint a[[[…]]]print b[[[…]]]

這一點(diǎn)是致命的,這與手動(dòng)進(jìn)行內(nèi)存管理所產(chǎn)生的內(nèi)存泄露毫無區(qū)別。

要解決這個(gè)問題,Python引入了其他的垃圾收集機(jī)制來彌補(bǔ)引用計(jì)數(shù)的缺陷:“標(biāo)記-清除”,“分代回收”兩種收集技術(shù)。

二、標(biāo)記-清除

“標(biāo)記-清除”是為了解決循環(huán)引用的問題。可以包含其他對象引用的容器對象(比如:list,set,dict,class,instance)都可能產(chǎn)生循環(huán)引用。

我們必須承認(rèn)一個(gè)事實(shí),如果兩個(gè)對象的引用計(jì)數(shù)都為1,但是僅僅存在他們之間的循環(huán)引用,那么這兩個(gè)對象都是需要被回收的,也就是說,它們的引用計(jì)數(shù)雖然表現(xiàn)為非0,但實(shí)際上有效的引用計(jì)數(shù)為0。我們必須先將循環(huán)引用摘掉,那么這兩個(gè)對象的有效計(jì)數(shù)就現(xiàn)身了。假設(shè)兩個(gè)對象為A、B,我們從A出發(fā),因?yàn)樗幸粋€(gè)對B的引用,則將B的引用計(jì)數(shù)減1;然后順著引用達(dá)到B,因?yàn)锽有一個(gè)對A的引用,同樣將A的引用減1,這樣,就完成了循環(huán)引用對象間環(huán)摘除。

但是這樣就有一個(gè)問題,假設(shè)對象A有一個(gè)對象引用C,而C沒有引用A,如果將C計(jì)數(shù)引用減1,而最后A并沒有被回收,顯然,我們錯(cuò)誤的將C的引用計(jì)數(shù)減1,這將導(dǎo)致在未來的某個(gè)時(shí)刻出現(xiàn)一個(gè)對C的懸空引用。這就要求我們必須在A沒有被刪除的情況下復(fù)原C的引用計(jì)數(shù),如果采用這樣的方案,那么維護(hù)引用計(jì)數(shù)的復(fù)雜度將成倍增加。

原理:“標(biāo)記-清除”采用了更好的做法,我們并不改動(dòng)真實(shí)的引用計(jì)數(shù),而是將集合中對象的引用計(jì)數(shù)復(fù)制一份副本,改動(dòng)該對象引用的副本。對于副本做任何的改動(dòng),都不會(huì)影響到對象生命走起的維護(hù)。

這個(gè)計(jì)數(shù)副本的唯一作用是尋找root object集合(該集合中的對象是不能被回收的)。當(dāng)成功尋找到root object集合之后,首先將現(xiàn)在的內(nèi)存鏈表一分為二,一條鏈表中維護(hù)root object集合,成為root鏈表,而另外一條鏈表中維護(hù)剩下的對象,成為unreachable鏈表。之所以要剖成兩個(gè)鏈表,是基于這樣的一種考慮:現(xiàn)在的unreachable可能存在被root鏈表中的對象,直接或間接引用的對象,這些對象是不能被回收的,一旦在標(biāo)記的過程中,發(fā)現(xiàn)這樣的對象,就將其從unreachable鏈表中移到root鏈表中;當(dāng)完成標(biāo)記后,unreachable鏈表中剩下的所有對象就是名副其實(shí)的垃圾對象了,接下來的垃圾回收只需限制在unreachable鏈表中即可。

三、分代回收

背景:分代的垃圾收集技術(shù)是在上個(gè)世紀(jì)80年代初發(fā)展起來的一種垃圾收集機(jī)制,一系列的研究表明:無論使用何種語言開發(fā),無論開發(fā)的是何種類型,何種規(guī)模的程序,都存在這樣一點(diǎn)相同之處。即:一定比例的內(nèi)存塊的生存周期都比較短,通常是幾百萬條機(jī)器指令的時(shí)間,而剩下的內(nèi)存塊,起生存周期比較長,甚至?xí)某绦蜷_始一直持續(xù)到程序結(jié)束。

從前面“標(biāo)記-清除”這樣的垃圾收集機(jī)制來看,這種垃圾收集機(jī)制所帶來的額外操作實(shí)際上與系統(tǒng)中總的內(nèi)存塊的數(shù)量是相關(guān)的,當(dāng)需要回收的內(nèi)存塊越多時(shí),垃圾檢測帶來的額外操作就越多,而垃圾回收帶來的額外操作就越少;反之,當(dāng)需回收的內(nèi)存塊越少時(shí),垃圾檢測就將比垃圾回收帶來更少的額外操作。為了提高垃圾收集的效率,采用“空間換時(shí)間的策略”。

原理:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,每一個(gè)集合就成為一個(gè)“代”,垃圾收集的頻率隨著“代”的存活時(shí)間的增大而減小。也就是說,活得越長的對象,就越不可能是垃圾,就應(yīng)該減少對它的垃圾收集頻率。那么如何來衡量這個(gè)存活時(shí)間:通常是利用幾次垃圾收集動(dòng)作來衡量,如果一個(gè)對象經(jīng)過的垃圾收集次數(shù)越多,可以得出:該對象存活時(shí)間就越長。

轉(zhuǎn)載:http://python.jobbole.com/82061/


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费a级毛片永久免费 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 日韩电影av在线 | 欧美国产一级片 | 国产91精品久久久久久 | 韩国精品久久久 | 黄网站在线免费 | h视频在线免费看 | 国产99久久精品一区二区 | 亚洲天堂ww | 亚洲国产精品久久久 | 黄色免费高清网站 | 国产精品一区二区视频 | 国产一精品一av一免费爽爽 | 极品销魂一区二区三区 | 羞羞视频2023 | 欧美日韩国产综合网 | 少妇一级淫片免费放4p | 欧美一级片 在线播放 | 欧美成人高清在线 | 在线中文字幕不卡 | 黄色片视频在线观看 | 精品国产三级a | 精国品产一区二区三区有限公司 | 欧美乱码精品一区 | 一区二区三区欧洲 | xp123精品视频 | 国产羞羞网站 | 中国免费一级毛片 | 欧美成人精品一区二区男人小说 | 毛片视频大全 | 激情小说另类 | 成人在线视频一区 | 一级做a爰性色毛片免费 | 国产精品久久久久久久久久大牛 | 末成年女av片一区二区 | 精品小视频| 成人福利网 | 亚洲一区二区三区视频免费 | 午夜神马福利视频 | 红杏网站永久免费视频入口 |