亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python中的垃圾回收機制

2019-11-06 06:24:53
字體:
來源:轉載
供稿:網友

Python中的垃圾回收機制是深入Python學習中需要了解的,查找資料時發現大多數講解Python的GC回收機制時對代碼深入講解的比較多,但是純原理深入講解的相對比較少,恰好看到了這個講述,就順手轉載了過來,用于自己加深原理理解,當然別的還有更多的代碼示例的,可以跟著一起理解。

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

一、引用計數

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

原理當一個對象的引用被創建或者復制時,對象的引用計數加1;當一個對象的引用被銷毀時,對象的引用計數減1;當對象的引用計數減少為0時,就意味著對象已經沒有被任何人使用了,可以將其所占用的內存釋放了。

雖然引用計數必須在每次分配和釋放內存的時候加入管理引用計數的動作,然而與其他主流的垃圾收集技術相比,引用計數有一個最大的有點,即“實時性”,任何內存,一旦沒有指向它的引用,就會立即被回收。而其他的垃圾收集計數必須在某種特殊條件下(比如內存分配失?。┎拍苓M行無效內存的回收。

引用計數機制執行效率問題:引用計數機制所帶來的維護引用計數的額外操作與Python運行中所進行的內存分配和釋放,引用賦值的次數是成正比的。而這點相比其他主流的垃圾回收機制,比如“標記-清除”,“停止-復制”,是一個弱點,因為這些技術所帶來的額外操作基本上只是與待回收的內存數量有關。

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

問題說明:

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

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

這一點是致命的,這與手動進行內存管理所產生的內存泄露毫無區別。

要解決這個問題,Python引入了其他的垃圾收集機制來彌補引用計數的缺陷:“標記-清除”,“分代回收”兩種收集技術。

二、標記-清除

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

我們必須承認一個事實,如果兩個對象的引用計數都為1,但是僅僅存在他們之間的循環引用,那么這兩個對象都是需要被回收的,也就是說,它們的引用計數雖然表現為非0,但實際上有效的引用計數為0。我們必須先將循環引用摘掉,那么這兩個對象的有效計數就現身了。假設兩個對象為A、B,我們從A出發,因為它有一個對B的引用,則將B的引用計數減1;然后順著引用達到B,因為B有一個對A的引用,同樣將A的引用減1,這樣,就完成了循環引用對象間環摘除。

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

原理:“標記-清除”采用了更好的做法,我們并不改動真實的引用計數,而是將集合中對象的引用計數復制一份副本,改動該對象引用的副本。對于副本做任何的改動,都不會影響到對象生命走起的維護。

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

三、分代回收

背景:分代的垃圾收集技術是在上個世紀80年代初發展起來的一種垃圾收集機制,一系列的研究表明:無論使用何種語言開發,無論開發的是何種類型,何種規模的程序,都存在這樣一點相同之處。即:一定比例的內存塊的生存周期都比較短,通常是幾百萬條機器指令的時間,而剩下的內存塊,起生存周期比較長,甚至會從程序開始一直持續到程序結束。

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

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

轉載:http://python.jobbole.com/82061/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影大全免费观看2023年上| 欧美精品18videos性欧| 欧美在线视频网| 欧美一级淫片videoshd| 亚洲欧美一区二区三区四区| 日韩中文字幕在线视频| 国产精品久久久亚洲| 亚洲国产古装精品网站| 538国产精品视频一区二区| 欧美xxxx综合视频| 国产欧美在线播放| 久久久久久久爱| 亚洲国产精品推荐| 亚洲午夜久久久久久久| 国产精品久久久久久五月尺| 国产一区二区在线免费视频| 美女视频黄免费的亚洲男人天堂| 国产成人亚洲综合91| xxxxx成人.com| 中文字幕综合一区| 欧美性猛交xxxx黑人猛交| 欧美交受高潮1| 久久人体大胆视频| 在线精品国产成人综合| 亚洲综合在线小说| 欧美资源在线观看| 91高潮精品免费porn| 亚洲xxxx做受欧美| 黄色一区二区三区| 欧美国产日韩中文字幕在线| 伊人久久久久久久久久久久久| 国产精品久久久久久久天堂| 欧美激情视频网| 精品久久国产精品| 中文字幕一区二区三区电影| 7777kkkk成人观看| 2019日本中文字幕| 亚洲欧美精品在线| 欧美精品一区三区| 国产精品久久久久久久久久小说| 国产美女久久精品| 欧美成年人在线观看| 96精品视频在线| 国产99视频精品免视看7| 38少妇精品导航| 国产在线观看不卡| 欧美激情视频网| 中文字幕欧美在线| 亚洲综合视频1区| 国产精品一二三视频| 欧美日韩在线一区| 日韩av中文字幕在线播放| 亚洲天堂色网站| 色综合久久88| 97成人在线视频| 亚洲女人被黑人巨大进入al| 日本aⅴ大伊香蕉精品视频| 亚洲午夜小视频| 午夜精品蜜臀一区二区三区免费| 久久天天躁狠狠躁老女人| 久久国产视频网站| 国产免费一区二区三区香蕉精| 欧美高清videos高潮hd| 欧美激情伊人电影| 亚洲自拍偷拍色片视频| 欧美激情高清视频| 国产亚洲精品一区二555| 在线视频欧美性高潮| 欧美大尺度激情区在线播放| 国产日韩欧美日韩| 亚洲国产天堂久久综合| 精品国产91乱高清在线观看| 91精品久久久久久久久久久久久| 欧美激情精品久久久| 日韩电影中文字幕在线| 亚洲欧洲日产国码av系列天堂| 久久精品99国产精品酒店日本| 精品国产一区av| 国产欧美一区二区白浆黑人| 在线国产精品视频| 欧洲成人在线视频| 91免费福利视频| 91嫩草在线视频| 久久精品视频在线观看| 国产福利精品在线| 欧美成aaa人片在线观看蜜臀| 欧美最猛黑人xxxx黑人猛叫黄| 国产suv精品一区二区三区88区| 亚洲女在线观看| 欧美激情综合色| 亚洲人成在线免费观看| 在线观看久久av| 国产自产女人91一区在线观看| 国a精品视频大全| 亚洲欧美中文在线视频| 欧美激情中文字幕在线| 欧美日韩福利视频| 中文字幕日韩精品有码视频| 欧美精品在线极品| 欧美精品精品精品精品免费| 成人夜晚看av| 亚洲免费伊人电影在线观看av| 午夜精品视频在线| 国产国语刺激对白av不卡| 高清欧美性猛交xxxx| 欧美精品在线视频观看| 色yeye香蕉凹凸一区二区av| 欧美日韩国产精品一区二区三区四区| 日韩精品视频在线免费观看| 国产精品电影久久久久电影网| 夜夜狂射影院欧美极品| 欧美二区乱c黑人| 中文字幕不卡在线视频极品| 欧美大成色www永久网站婷| 国内精品一区二区三区| 国产精品专区一| 国产一区二区黑人欧美xxxx| 久久99热精品这里久久精品| 国产欧美日韩亚洲精品| 亚洲性xxxx| 欧美激情视频网| 亚洲人成电影网| 欧美激情亚洲综合一区| 欧美大片在线影院| 一区二区亚洲欧洲国产日韩| 欧美疯狂xxxx大交乱88av| 国内免费久久久久久久久久久| 国产精品igao视频| 精品二区三区线观看| 韩国三级日本三级少妇99| 国产精品电影久久久久电影网| 亚洲欧美日本伦理| 国产精品久久久久一区二区| 久久久噜噜噜久久中文字免| 久久手机精品视频| 中文字幕国产日韩| 午夜免费日韩视频| 九九热在线精品视频| 欧美性xxxxx| 中文字幕亚洲无线码a| 国外成人免费在线播放| 91系列在线观看| 国产免费一区二区三区在线观看| 日韩美女av在线免费观看| 中日韩午夜理伦电影免费| 欧美亚洲视频在线看网址| 久久视频在线直播| 欧美电影免费观看电视剧大全| 国产欧美欧洲在线观看| 国产成人一区二区三区电影| 欧美激情中文字幕乱码免费| 国产91精品在线播放| 久久中文字幕一区| 日韩欧美国产激情| 亚洲欧美三级伦理| 国产精品爽黄69天堂a| 久久久人成影片一区二区三区观看| 久久久91精品| 亚洲人午夜精品| 精品毛片网大全| 青青草原成人在线视频| 久久亚洲精品中文字幕冲田杏梨| 97国产真实伦对白精彩视频8| 日本精品在线视频|