jvm垃圾收集算法? 標(biāo)記-清除算法

當(dāng)堆中的有效內(nèi)存空間(available memory)被耗盡的時(shí)候悼凑,就會(huì)停止整個(gè)程序(也被成為stop the world)嘁酿,然后進(jìn)行兩項(xiàng)工作徙硅,第一項(xiàng)則是標(biāo)記,第二項(xiàng)則是清除焰情。

標(biāo)記:標(biāo)記的過(guò)程其實(shí)就是陌凳,遍歷所有的GC Roots,然后將所有GC Roots可達(dá)的對(duì)象標(biāo)記為存活的對(duì)象内舟。

清除:清除的過(guò)程將遍歷堆中所有的對(duì)象合敦,將沒(méi)有標(biāo)記的對(duì)象全部清除掉。

用通俗的話解釋一下標(biāo)記/清除算法验游,就是當(dāng)程序運(yùn)行期間充岛,若可以使用的內(nèi)存被耗盡的時(shí)候,GC線程就會(huì)被觸發(fā)并將程序暫停批狱,隨后將依舊存活的對(duì)象標(biāo)記一遍裸准,最終再將堆中所有沒(méi)被標(biāo)記的對(duì)象全部清除掉展东,接下來(lái)便讓程序恢復(fù)運(yùn)行赔硫。


我們來(lái)直觀的看下這一過(guò)程,首先是第一張圖盐肃。

這張圖代表的是程序運(yùn)行期間所有對(duì)象的狀態(tài)爪膊,它們的標(biāo)志位全部是0(也就是未標(biāo)記权悟,以下默認(rèn)0就是未標(biāo)記,1為已標(biāo)記)推盛,假設(shè)這會(huì)兒有效內(nèi)存空間耗盡了峦阁,JVM將會(huì)停止應(yīng)用程序的運(yùn)行并開(kāi)啟GC線程,然后開(kāi)始進(jìn)行標(biāo)記工作耘成,按照根搜索算法榔昔,標(biāo)記完以后,對(duì)象的狀態(tài)如下圖瘪菌。

可以看到撒会,按照根搜索算法,所有從root對(duì)象可達(dá)的對(duì)象就被標(biāo)記為了存活的對(duì)象师妙,此時(shí)已經(jīng)完成了第一階段標(biāo)記诵肛。接下來(lái),就要執(zhí)行第二階段清除了默穴,那么清除完以后怔檩,剩下的對(duì)象以及對(duì)象的狀態(tài)如下圖所示。

可以看到蓄诽,沒(méi)有被標(biāo)記的對(duì)象將會(huì)回收清除掉薛训,而被標(biāo)記的對(duì)象將會(huì)留下,并且會(huì)將標(biāo)記位重新歸0仑氛。接下來(lái)就不用說(shuō)了许蓖,喚醒停止的程序線程,讓程序繼續(xù)運(yùn)行即可调衰。

其實(shí)這一過(guò)程并不復(fù)雜膊爪,甚至可以說(shuō)非常簡(jiǎn)單,各位說(shuō)對(duì)嗎嚎莉。不過(guò)其中有一點(diǎn)值得LZ一提米酬,就是為什么非要停止程序的運(yùn)行呢?

這個(gè)其實(shí)也不難理解趋箩,LZ舉個(gè)最簡(jiǎn)單的例子赃额,假設(shè)我們的程序與GC線程是一起運(yùn)行的,各位試想這樣一種場(chǎng)景叫确。

假設(shè)我們剛標(biāo)記完圖中最右邊的那個(gè)對(duì)象跳芳,暫且記為A,結(jié)果此時(shí)在程序當(dāng)中又new了一個(gè)新對(duì)象B竹勉,且A對(duì)象可以到達(dá)B對(duì)象飞盆。但是由于此時(shí)A對(duì)象已經(jīng)標(biāo)記結(jié)束,B對(duì)象此時(shí)的標(biāo)記位依然是0,因?yàn)樗e(cuò)過(guò)了標(biāo)記階段吓歇。因此當(dāng)接下來(lái)輪到清除階段的時(shí)候孽水,新對(duì)象B將會(huì)被苦逼的清除掉。如此一來(lái)城看,不難想象結(jié)果女气,GC線程將會(huì)導(dǎo)致程序無(wú)法正常工作。

上面的結(jié)果當(dāng)然令人無(wú)法接受测柠,我們剛new了一個(gè)對(duì)象炼鞠,結(jié)果經(jīng)過(guò)一次GC,忽然變成null了轰胁,這還怎么玩簇搅?

到此為止,標(biāo)記/清除算法LZ已經(jīng)介紹完了软吐,下面我們來(lái)看下它的缺點(diǎn)瘩将,其實(shí)了解完它的算法原理,它的缺點(diǎn)就很好理解了凹耙。

1姿现、首先,它的缺點(diǎn)就是效率比較低(遞歸與全堆對(duì)象遍歷)肖抱,而且在進(jìn)行GC的時(shí)候备典,需要停止應(yīng)用程序,這會(huì)導(dǎo)致用戶(hù)體驗(yàn)非常差勁意述,尤其對(duì)于交互式的應(yīng)用程序來(lái)說(shuō)簡(jiǎn)直是無(wú)法接受提佣。試想一下,如果你玩一個(gè)網(wǎng)站荤崇,這個(gè)網(wǎng)站一個(gè)小時(shí)就掛五分鐘拌屏,你還玩嗎?

2术荤、第二點(diǎn)主要的缺點(diǎn)倚喂,則是這種方式清理出來(lái)的空閑內(nèi)存是不連續(xù)的,這點(diǎn)不難理解瓣戚,我們的死亡對(duì)象都是隨即的出現(xiàn)在內(nèi)存的各個(gè)角落的端圈,現(xiàn)在把它們清除之后,內(nèi)存的布局自然會(huì)亂七八糟子库。而為了應(yīng)付這一點(diǎn)舱权,JVM就不得不維持一個(gè)內(nèi)存的空閑列表,這又是一種開(kāi)銷(xiāo)仑嗅。而且在分配數(shù)組對(duì)象的時(shí)候宴倍,尋找連續(xù)的內(nèi)存空間會(huì)不太好找张症。

看完它的缺點(diǎn)估計(jì)有的猿友要忍不住吐糟了,“這么說(shuō)這個(gè)算法根本沒(méi)法用嘛啊楚,那LZ還介紹這么個(gè)玩意干什么』胝茫”

猿友們莫要著急恭理,一個(gè)算法有缺點(diǎn),高人們自然會(huì)想盡辦法去完善它的郭变。而接下來(lái)我們要介紹的兩種算法颜价,皆是在標(biāo)記/清除算法的基礎(chǔ)上優(yōu)化而產(chǎn)生的炮叶。具體的內(nèi)容琐簇,下一次LZ再和各位分享挪捕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甥桂,一起剝皮案震驚了整個(gè)濱河市蒂誉,隨后出現(xiàn)的幾起案子哩罪,更是在濱河造成了極大的恐慌冠骄,老刑警劉巖攒读,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片排,死亡現(xiàn)場(chǎng)離奇詭異寨腔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)率寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)迫卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冶共,你說(shuō)我怎么就攤上這事乾蛤。” “怎么了捅僵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵家卖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庙楚,道長(zhǎng)篡九,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任醋奠,我火速辦了婚禮榛臼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窜司。我一直安慰自己沛善,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布塞祈。 她就那樣靜靜地躺著金刁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤蛮,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天媳友,我揣著相機(jī)與錄音,去河邊找鬼产捞。 笑死醇锚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坯临。 我是一名探鬼主播焊唬,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼看靠!你這毒婦竟也來(lái)了赶促?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挟炬,失蹤者是張志新(化名)和其女友劉穎鸥滨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谤祖,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爵赵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泊脐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空幻。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖容客,靈堂內(nèi)的尸體忽然破棺而出秕铛,到底是詐尸還是另有隱情,我是刑警寧澤缩挑,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布但两,位于F島的核電站,受9級(jí)特大地震影響供置,放射性物質(zhì)發(fā)生泄漏谨湘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一芥丧、第九天 我趴在偏房一處隱蔽的房頂上張望紧阔。 院中可真熱鬧,春花似錦续担、人聲如沸擅耽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乖仇。三九已至憾儒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乃沙,已是汗流浹背起趾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留警儒,地道東北人训裆。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冷蚂,于是被迫代替她去往敵國(guó)和親缭保。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汛闸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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