垃圾收集算法

這里介紹幾種垃圾收集算法的思想及其發(fā)展過程翅睛。

標(biāo)記-清除算法(Mark-Sweep)

標(biāo)記-清除算法是最基礎(chǔ)的收集算法影所,后續(xù)的收集算法都是基于這種思路并對(duì)其缺點(diǎn)進(jìn)行改進(jìn)而得到的。

執(zhí)行過程

  • 標(biāo)記出所有需要回收的對(duì)象踩衩。
  • 統(tǒng)一回收掉所有被標(biāo)記的對(duì)象。

缺點(diǎn)

  • 效率問題:標(biāo)記和清除過程的效率都不高。
  • 空間問題:標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片蚓胸,空間碎片太多可能會(huì)導(dǎo)致,當(dāng)程序在以后的運(yùn)行過程中需要分配較大對(duì)象時(shí)無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作除师。

復(fù)制算法(Copying)

為了解決標(biāo)記-清除算法的缺點(diǎn)就出現(xiàn)了復(fù)制算法沛膳。

執(zhí)行過程

  • 將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中一塊汛聚。
  • 當(dāng)正在使用的這塊內(nèi)存用完了锹安,就將存活的對(duì)象復(fù)制到另外一塊上面。
  • 然后把已使用過的內(nèi)存空間一次清理掉倚舀。

優(yōu)點(diǎn)

每次都是對(duì)其中一塊內(nèi)存進(jìn)行回收叹哭,內(nèi)存分配時(shí)不需要考慮內(nèi)存碎片等復(fù)雜情況,只要移動(dòng)堆頂指針痕貌,按順序分配內(nèi)存即可风罩,實(shí)現(xiàn)簡單,運(yùn)行高效舵稠。

缺點(diǎn)

這種算法的代價(jià)是將內(nèi)存縮小為原來的一半超升。


改進(jìn)后的復(fù)制算法

現(xiàn)代的商業(yè)虛擬機(jī)都是采用復(fù)制算法來回收新生代,而研究表明新生代中的對(duì)象98%是朝生夕死的哺徊,所以并不需要按照1:1的比例來劃分內(nèi)存空間室琢。

執(zhí)行過程

  • 將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中的一塊Survivor空間落追。
  • 當(dāng)回收時(shí)盈滴,將Eden和Survivor空間中還存活的對(duì)象一次性拷貝到另外一塊沒有使用的Survivor空間上。
  • 最后清理掉Eden和剛才用過的Survivor空間轿钠。

優(yōu)點(diǎn)

HotSpot虛擬機(jī)默認(rèn)Eden和Survivor的大小比例是8:1巢钓,也就是每次新生代中可用內(nèi)存空間為整個(gè)新生代容量的90%(80%+10%)病苗,只有10%的內(nèi)存是會(huì)被“浪費(fèi)”的。

缺點(diǎn)

  • 98%的對(duì)象可回收只是一般場(chǎng)景下的數(shù)據(jù)竿报,沒有辦法保證每次回收都只有不多于10%的對(duì)象存活铅乡,當(dāng)Survivor空間不夠用時(shí),需要依賴其他內(nèi)存(這里指老年代)進(jìn)行分配擔(dān)保(Handle Promotion)烈菌。
  • 同時(shí)在對(duì)象存活率較高的時(shí)候要執(zhí)行較多的復(fù)制操作阵幸,效率將會(huì)變低。

標(biāo)記-整理算法(Mark-Compact)

由于復(fù)制收集算法在對(duì)象存活率較高時(shí)需要分配擔(dān)保和較多的復(fù)制操作芽世,老年代一般不能直接選用這種算法挚赊。于是,根據(jù)老年代的特別济瓢,有人就提出了一種“標(biāo)記-整理”算法荠割。

執(zhí)行過程

  • 標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣。
  • 將所有存活對(duì)象都移動(dòng)到內(nèi)存的一端旺矾。
  • 直接清理掉端邊界以外的內(nèi)存蔑鹦。

分代收集算法(Generational Collection)

當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都是采用分代收集算法。這種算法沒什么新的思想箕宙,只是根據(jù)對(duì)象的存活周期的不同將內(nèi)存分為幾塊嚎朽。一般是把Java堆分為新生代和老年代,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?/p>

  • 在新生代中柬帕,每次垃圾收集時(shí)都只有少量對(duì)象存活哟忍,所以選用復(fù)制算法,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集陷寝。
  • 在老年代中锅很,因?yàn)閷?duì)象存活率高,沒有額外空間對(duì)它進(jìn)行分配擔(dān)保凤跑,就必須使用“標(biāo)記-清除”或“標(biāo)記-整理”算法來進(jìn)行回收爆安。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饶火,隨后出現(xiàn)的幾起案子鹏控,更是在濱河造成了極大的恐慌,老刑警劉巖肤寝,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抖僵,居然都是意外死亡鲤看,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門耍群,熙熙樓的掌柜王于貴愁眉苦臉地迎上來义桂,“玉大人找筝,你說我怎么就攤上這事】兜酰” “怎么了袖裕?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溉瓶。 經(jīng)常有香客問我急鳄,道長,這世上最難降的妖魔是什么堰酿? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任疾宏,我火速辦了婚禮,結(jié)果婚禮上触创,老公的妹妹穿的比我還像新娘坎藐。我一直安慰自己,他們只是感情好哼绑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布岩馍。 她就那樣靜靜地躺著,像睡著了一般抖韩。 火紅的嫁衣襯著肌膚如雪蛀恩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天帽蝶,我揣著相機(jī)與錄音赦肋,去河邊找鬼。 笑死励稳,一個(gè)胖子當(dāng)著我的面吹牛佃乘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驹尼,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼趣避,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了新翎?” 一聲冷哼從身側(cè)響起程帕,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎地啰,沒想到半個(gè)月后愁拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亏吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年岭埠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜论,死狀恐怖许赃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情馆类,我是刑警寧澤混聊,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乾巧,受9級(jí)特大地震影響句喜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卧抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一藤滥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧社裆,春花似錦拙绊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗜傅,卻和暖如春金句,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吕嘀。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工违寞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偶房。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓趁曼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棕洋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挡闰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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