Python垃圾回收機(jī)制

序言

不同于C/C++,像Python這樣的語言是不需要程序員寫代碼來管理內(nèi)存的益涧,它的GC(Garbage Collection)機(jī)制 實(shí)現(xiàn)了自動內(nèi)存管理。GC做的事情就是解放程序員的雙手驯鳖,找出內(nèi)存中不用的資源并釋放這塊內(nèi)存闲询。 下面我們來看看Python的GC是怎么做的:

Python自帶的解釋器CPython主要使用了三種垃圾回收機(jī)制(引用計數(shù)為主,標(biāo)記-清除和分代回收為輔):

  • 引用計數(shù)
  • 標(biāo)記清除
  • 分代回收

下面讓我們分別了解下這幾種機(jī)制:

引用計數(shù)

引用計數(shù)法Reference Counting的原理是浅辙,每個對象都維護(hù)一個引用計數(shù)字段扭弧,記錄這個對象被引用的次數(shù)(如果不清楚變量->引用->對象 的問題,可以查看這篇文章Python的深拷貝和淺拷貝),如果有新的引用指向?qū)ο蠹怯撸瑢ο笠糜嫈?shù)就加一鸽捻,引用被銷毀時,對象引用計數(shù)減一泽腮,當(dāng)用戶的引用計數(shù)為0時御蒲,該內(nèi)存被釋放∈⒄可以通過sys.getrefcount()函數(shù)查看對象被引用的個數(shù)删咱。

這種方法主要存在兩種問題:

  • 需要去維護(hù)引用計數(shù),存在執(zhí)行效率問題
  • 無法解決循環(huán)引用問題

所謂循環(huán)引用就是:有一組對象的引用計數(shù)不為0豪筝,但是這組對象實(shí)際上并沒有被變量引用,它們之間是相互引用摘能,而且也不會有其他的變量再去引用這組對象续崖,最終導(dǎo)致如果使用 引用計數(shù)法 這些對象占用的內(nèi)存永遠(yuǎn)不會被釋放。

寫一段代碼舉個例子:

In [23]: a = []

In [24]: b = []

In [25]: a.append(b)

In [26]: b.append(a)

In [27]: a
Out[27]: [[[...]]]

In [28]: b
Out[28]: [[[...]]]

可以看到团搞,現(xiàn)在a b都出現(xiàn)了循環(huán)引用严望,此時就算使用del語句刪除變量,被使用的內(nèi)存也不會被回收逻恐,所以就需要第二種GC機(jī)制:

標(biāo)記清除

標(biāo)記清除Mark-Sweep是針對循環(huán)引用問題的回收機(jī)制像吻,作用的對象是容器類型的對象(比如:list、set复隆、dict等)拨匆。
原理是:通過根節(jié)點(diǎn)對象(不會被刪除的對象)對有向圖把所有活動對象打上標(biāo)記,然后回收沒有被標(biāo)記的非活動對象挽拂。

分代回收

分代回收是建立在標(biāo)記清除基礎(chǔ)上的一種輔助回收容器對象的GC機(jī)制惭每。 無論開發(fā)的程序類型如何,規(guī)模如何亏栈,都有這樣的相同之處:一些比例的內(nèi)存生存周期都很短台腥,而另一些內(nèi)存的生存周期比較長宏赘,可能會伴隨著整個程序的開始和結(jié)束。 所以分代回收就根據(jù)系統(tǒng)中內(nèi)存存活時間把它們劃分成不同的集合:一共分成三個集合黎侈,每個集合稱為一個察署。 它們的垃圾收集頻率 隨 對象 存活存活時間的增大 而 減小。也就是說:對于存活時間越長的對象峻汉,就越不可能是垃圾贴汪,減少對其的收集頻率。而新創(chuàng)建的對象都在第一代俱济,第一代集合總數(shù)達(dá)到上限后嘶是,會觸發(fā)GC機(jī)制:可以回收的對象所占的內(nèi)存被釋放,不能被回收的移到中年代蛛碌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聂喇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔚携,更是在濱河造成了極大的恐慌希太,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝蜒,死亡現(xiàn)場離奇詭異誊辉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亡脑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門堕澄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霉咨,你說我怎么就攤上這事蛙紫。” “怎么了途戒?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵坑傅,是天一觀的道長。 經(jīng)常有香客問我喷斋,道長唁毒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任星爪,我火速辦了婚禮浆西,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘移必。我一直安慰自己室谚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秒赤,像睡著了一般猪瞬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上入篮,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天陈瘦,我揣著相機(jī)與錄音,去河邊找鬼潮售。 笑死痊项,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酥诽。 我是一名探鬼主播鞍泉,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肮帐!你這毒婦竟也來了咖驮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤训枢,失蹤者是張志新(化名)和其女友劉穎托修,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恒界,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睦刃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了十酣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩拙。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耸采,靈堂內(nèi)的尸體忽然破棺而出吃环,到底是詐尸還是另有隱情,我是刑警寧澤洋幻,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翅娶,受9級特大地震影響文留,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竭沫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一燥翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜕提,春花似錦森书、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨名。三九已至,卻和暖如春猖毫,著一層夾襖步出監(jiān)牢的瞬間台谍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工吁断, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趁蕊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓仔役,卻偏偏與公主長得像掷伙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子又兵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容