垃圾回收原來是這么回事

摘要:John McCarthy身為Lisp之父和人工智能之父晰房,同時还绘,他也是GC之父。1960年如庭,他在其論文中首次發(fā)布了GC算法(其實是委婉的提出??)。而Java的前身Oak是在1990發(fā)布的撼港,利用JVM實現(xiàn)了跨平臺坪它。GC因此一舉成名。

最近想復(fù)習一下JVM的知識帝牡。然后發(fā)現(xiàn)網(wǎng)上不少文章在寫JVM的垃圾回收算法時往毡,都比較偏向于具體實現(xiàn),而少有站在更高角度來看垃圾回收算法的文章否灾。而我本人想對垃圾回收算法有個全景的認識,所以鸣奔,就找到了這本《垃圾回收的算法與實現(xiàn)》(以下簡稱《垃圾回收》)墨技。本篇博客就是嘗試對“全景”的總結(jié)。

以下為方便討論挎狸,垃圾回收縮寫成GC扣汪。

為什么要有GC

我時而聽到C++程序員說我們是被GC慣壞了的一代。的確是這樣的锨匆,我本人在學(xué)習GC算法時崭别,大腦里第一問題就是為什么需要GC這樣的東西。說明我已經(jīng)認為GC是理所當然了恐锣。??

總的一句話:沒有GC的世界茅主,我們需要手動進行內(nèi)存管理,而手動內(nèi)存管理是純技術(shù)活土榴,又容易出錯诀姚。

既然我們寫的大多程序都是為了解決現(xiàn)實業(yè)務(wù)問題,那么玷禽,我們?yōu)槭裁床话堰@種純技術(shù)活自動化呢赫段?但是自動化,也是有代價的矢赁。這是我的個人理解糯笙,不代表John McCarthy本人的理解

“垃圾”的定義

首先撩银,我們要給個“垃圾”的定義给涕,才能進行回收吧。書中給出的定義: > 把分配到堆中那些不能通過程序引用的對象稱為非活動對象,也就是死掉的對象稠炬,我們稱為“垃圾”焕阿。

GC的定義

因為我們期望讓內(nèi)存管理變得自動(只管用內(nèi)存,不管內(nèi)存的回收)首启,我們就必須做兩件事情: > 1. 找到內(nèi)存空間里的垃圾 > 2.

回收垃圾暮屡,讓程序員能再次利用這部分空間 [1] 只要滿足這兩項功能的程序,就是GC毅桃,不論它是在JVM中褒纲,還是在Ruby的VM中。

但這只是兩個需求钥飞,并沒有說明GC應(yīng)該何時找垃圾莺掠,何時回收垃圾等等更具體的問題,各類GC算法就是在這些更具體問題的處理方式上施展手腳读宙。

GC的歷史

John McCarthy身為Lisp之父和人工智能之父彻秆,同時,他也是GC之父结闸。1960年唇兑,他在其論文中首次發(fā)布了GC算法(其實是委婉的提出??)。

標記-清除算法由John McCarthy在1960年提出

引用計數(shù)法由George E. Collins在1960年提出 此算法會有循環(huán)引用問題桦锄,Harold McBeth1963年指出扎附。

復(fù)制算法由Marvin L. Minsky在1963年提出

《垃圾回收》的作者認為:

從50年前GC算法首次發(fā)布以來,眾多研究者對其進行了各種各樣的研究结耀,因此許多GC算法也得以發(fā)布留夜。[2] 但事實上,這些算法只不過是把前文中提到的三種算法進行組合或應(yīng)用图甜。也可以這么說碍粥,1963年GC復(fù)制算法誕生時,GC的根本性內(nèi)容就已經(jīng)完成了黑毅。[3]

那我們常常聽說的分代垃圾回收又是怎么回事即纲?作者是這樣說的: >

人們從眾多程序案例中總結(jié)出了一個經(jīng)驗:“大部分的對象在生成后馬上就變成了垃圾,很少有對象能活得很久”博肋。分代垃圾回收利用該經(jīng)驗低斋,在對象中導(dǎo)入了“年齡”的概念,經(jīng)歷過一次GC后活下來的對象年齡為1歲匪凡。[4]

分代垃圾回收中把對象分類成幾代膊畴,針對不同的代使用不同的GC算法,我們把剛生成的對象稱為新生代對象病游,到達一定年齡的對象則稱為老年代對象唇跨。[5]

好了稠通,這下我總算知道為什么要分代了,我的總結(jié)是: 將對象根據(jù)存活概率進行分類买猖,對存活時間長一些的對象改橘,可以減少掃描“垃圾”的時間,以減少GC頻率和時長玉控。根本思路就是對對象進行分類飞主,才能針對各個分類采用不同的垃圾回收算法,以對各算法進行揚長避短高诺。

留一個問題給讀者:我們知道分代垃圾回收所采用的堆結(jié)構(gòu)是:

為什么新生代空間要分成“生成空間”和“幸存空間”碌识,而幸存空間又分成兩塊大小相等的幸存空間1,幸存空間2?

這些GC算法共同解決的問題

上面我們說了虱而,GC的定義只給出了需求筏餐,三種算法都為實現(xiàn)這個需求,那么它們總會遇到共同要解決的問題吧牡拇? 我嘗試總結(jié)出:

如何分辨出什么是垃圾魁瞪?

如何、何時搜索垃圾惠呼?

如何导俘、何時清除垃圾?

這樣罢杉,只要涉及到垃圾回收趟畏,我就可以從這2點需求贡歧,3個共同問題(兩點三共)出發(fā)來討論滩租、學(xué)習。

如何評價GC算法利朵?

如果沒有評價標準律想,我們當然無法評估這些GC算法的性能。作者給出了4個標準:

吞吐量: 單位時間內(nèi)的處理能力

最大暫停時間:GC執(zhí)行過程中绍弟,應(yīng)用暫停的時長技即。 較大的吞吐量和較短的最大暫停時間不可兼得

堆的使用效率:就是堆空間的利用率。 可用的堆越大樟遣,GC運行越快而叼;相反,越想有效地利用有限的堆豹悬,GC花費的時間就越長葵陵。

訪問的局部性:把具有引用關(guān)系的對象安排在堆中較近的位置,就能提高在緩存中讀取到想利用的數(shù)據(jù)的概率瞻佛。

好吧脱篙。兩點三共娇钱,四標~

小結(jié)

搞清楚為什么要GC,要實現(xiàn)GC都要解決什么問題绊困,而各類算法又是怎么解決的文搂,最后怎么評價這些算法。GC原來是這么回事秤朗。

但是這不是GC的全部煤蹭。但是提供我一個思考GC的思考框架。

以上就是《垃圾回收的算法與實現(xiàn)》的讀書筆記川梅。如果想更深入疯兼,可以閱讀《垃圾回收算法手冊:自動內(nèi)存管理的藝術(shù)》。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贫途,一起剝皮案震驚了整個濱河市吧彪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丢早,老刑警劉巖姨裸,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怨酝,居然都是意外死亡傀缩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門农猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赡艰,“玉大人,你說我怎么就攤上這事斤葱】犊澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵揍堕,是天一觀的道長料身。 經(jīng)常有香客問我,道長衩茸,這世上最難降的妖魔是什么芹血? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮楞慈,結(jié)果婚禮上幔烛,老公的妹妹穿的比我還像新娘。我一直安慰自己囊蓝,他們只是感情好饿悬,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慎颗,像睡著了一般乡恕。 火紅的嫁衣襯著肌膚如雪言询。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天傲宜,我揣著相機與錄音运杭,去河邊找鬼。 笑死函卒,一個胖子當著我的面吹牛辆憔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播报嵌,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼虱咧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锚国?” 一聲冷哼從身側(cè)響起腕巡,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎血筑,沒想到半個月后绘沉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡豺总,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年车伞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喻喳。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡另玖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出表伦,到底是詐尸還是另有隱情谦去,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布绑榴,位于F島的核電站哪轿,受9級特大地震影響盈魁,放射性物質(zhì)發(fā)生泄漏翔怎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一杨耙、第九天 我趴在偏房一處隱蔽的房頂上張望赤套。 院中可真熱鬧,春花似錦珊膜、人聲如沸容握。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剔氏。三九已至塑猖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谈跛,已是汗流浹背羊苟。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留感憾,地道東北人蜡励。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像阻桅,于是被迫代替她去往敵國和親凉倚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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