Python3之對(duì)象垃圾收集機(jī)制淺析

177.jpg

概述

GC作為現(xiàn)代編程語(yǔ)言的自動(dòng)內(nèi)存管理機(jī)制,專(zhuān)注于兩件事:1. 找到內(nèi)存中無(wú)用的垃圾資源 2. 清除這些垃圾并把內(nèi)存讓出來(lái)給其他對(duì)象使用乃正。 在Python中,它在每個(gè)對(duì)象中保持了一個(gè)計(jì)數(shù)器,用于記錄指向該對(duì)象的的引用的個(gè)數(shù)。一旦這個(gè)計(jì)數(shù)器為0時(shí)护锤,則立即回收該對(duì)象,對(duì)象占用的內(nèi)存空間將被釋放减拭。

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

我們可以利用簡(jiǎn)單的變量引用和銷(xiāo)毀窺見(jiàn)引用計(jì)數(shù)過(guò)程蔽豺。

增加引用計(jì)數(shù)

增加引用計(jì)數(shù)的方式多種区丑,即對(duì)象進(jìn)行引用拧粪,那么計(jì)數(shù)器都會(huì)+1

# 創(chuàng)建第一個(gè)引用
a = 3
# 用其他變量名引用
b = a
# 成為一個(gè)容器的對(duì)象
L = [1, a]
# 作為參數(shù)傳遞
str(a)

減少引用計(jì)數(shù)

同理,以下是減少引用計(jì)數(shù)的一些方法

# 一個(gè)本地引用離開(kāi)了其作用范圍沧侥。比如`str()`函數(shù)結(jié)束時(shí)
str(a)
# 對(duì)象的別名被顯式銷(xiāo)毀 
del a   
# 對(duì)象的一個(gè)別名被復(fù)制給其他對(duì)象 
a = 'Python'
# 對(duì)象從一個(gè)窗口對(duì)象中移除 
L.remove(a)
# 窗口對(duì)象本身被銷(xiāo)毀 
del L

循環(huán)引用問(wèn)題

什么是循環(huán)引用可霎?A和B相互引用而再?zèng)]有外部引用A與B中的任何一個(gè),它們的引用計(jì)數(shù)雖然都為1宴杀,但顯然應(yīng)該被回收癣朗。

# 對(duì)象a的引用計(jì)數(shù)為 1
a = {}
# 對(duì)象B的引用計(jì)數(shù)為 1
b = {}
# B的引用計(jì)數(shù)增1
a['b'] = b
# A的引用計(jì)數(shù)增1
b['a'] = a
# A的引用減 1,最后A對(duì)象的引用為 1
del a
# B的引用減 1, 最后B對(duì)象的引用為 1
del b

在這個(gè)例子中程序執(zhí)行完del語(yǔ)句后旺罢,A旷余、B對(duì)象已經(jīng)沒(méi)有任何引用指向這兩個(gè)對(duì)象,但這兩個(gè)對(duì)象卻還各自引用這對(duì)象扁达,雖然兩個(gè)對(duì)象已經(jīng)被del了正卧,即我們不能再使用這兩個(gè)對(duì)象,即垃圾對(duì)象跪解,但是他們的引用計(jì)數(shù)并沒(méi)有減少到零炉旷。即根據(jù)引用計(jì)數(shù)機(jī)制,他們并不會(huì)被回收,且會(huì)一直駐留在內(nèi)存中窘行,造成內(nèi)存泄漏饥追。為了解決對(duì)象的循環(huán)引用問(wèn)題,而Python引入了標(biāo)記-清除分代回收兩種GC機(jī)制來(lái)解決優(yōu)化此問(wèn)題罐盔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末但绕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惶看,更是在濱河造成了極大的恐慌壁熄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碳竟,死亡現(xiàn)場(chǎng)離奇詭異草丧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)莹桅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)昌执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诈泼,你說(shuō)我怎么就攤上這事懂拾。” “怎么了铐达?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵岖赋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓮孙,道長(zhǎng)唐断,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任杭抠,我火速辦了婚禮脸甘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偏灿。我一直安慰自己丹诀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布翁垂。 她就那樣靜靜地躺著铆遭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沿猜。 梳的紋絲不亂的頭發(fā)上枚荣,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音邢疙,去河邊找鬼棍弄。 笑死望薄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呼畸。 我是一名探鬼主播痕支,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛮原!你這毒婦竟也來(lái)了卧须?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤儒陨,失蹤者是張志新(化名)和其女友劉穎花嘶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蹦漠,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椭员,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笛园。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘击。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖研铆,靈堂內(nèi)的尸體忽然破棺而出埋同,到底是詐尸還是另有隱情,我是刑警寧澤棵红,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布凶赁,位于F島的核電站,受9級(jí)特大地震影響逆甜,放射性物質(zhì)發(fā)生泄漏虱肄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一忆绰、第九天 我趴在偏房一處隱蔽的房頂上張望浩峡。 院中可真熱鬧,春花似錦错敢、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至平斩,卻和暖如春亚享,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绘面。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工欺税, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侈沪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓晚凿,卻偏偏與公主長(zhǎng)得像亭罪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歼秽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • python內(nèi)存管理是通過(guò)引用計(jì)數(shù)來(lái)實(shí)現(xiàn)的应役。當(dāng)對(duì)象的引用計(jì)數(shù)為0時(shí),會(huì)被gc回收燥筷。 為了探索對(duì)象在內(nèi)存的存儲(chǔ)箩祥,我們...
    冬季戀歌1218閱讀 1,643評(píng)論 0 2
  • 1.元類(lèi) 1.1.1類(lèi)也是對(duì)象 在大多數(shù)編程語(yǔ)言中,類(lèi)就是一組用來(lái)描述如何生成一個(gè)對(duì)象的代碼段肆氓。在Python中這...
    TENG書(shū)閱讀 1,253評(píng)論 0 3
  • 通過(guò)這篇文章你能知道的問(wèn)題: 1.如何判斷對(duì)象是活著還是死去袍祖? 2.在Java語(yǔ)言中,可作為GCRoots的對(duì)象有...
    beneke閱讀 1,351評(píng)論 0 1
  • 一元類(lèi) 1類(lèi)也是對(duì)象 在大多數(shù)編程語(yǔ)言中,類(lèi)就是一組用來(lái)描述如何生成一個(gè)對(duì)象的代碼段键耕。在Python中這一點(diǎn)仍然成...
    五行缺覺(jué)閱讀 1,039評(píng)論 0 1
  • 老家隔壁有個(gè)老年癡呆癥的老人留守老宅寺滚,跟其差不多已經(jīng)失明的兒子相依為命。 這老人屈雄,今年八十九歲村视,身體瘦削,舉止蹣跚...
    莫西干人閱讀 705評(píng)論 0 0