分代假說
1. 弱分代假說(Weak Generational Hypothesis):絕大多數(shù)對(duì)象都是朝生夕滅的
2. 強(qiáng)分代假說(Strong Generational Hypothesis):熬過越多次垃圾收集過程的對(duì)象就越難以消亡
3. 跨代引用假說(Intergenerational Reference Hypothesis):跨代引用相對(duì)于同代引用來說僅占極少數(shù)
?? 收集器應(yīng)該將Java堆劃分出不同的區(qū)域,然后將回收對(duì)象依據(jù)其年齡(年齡即對(duì)象熬過垃圾收集過程的次數(shù))分配到不同的區(qū)域之中存儲(chǔ)。
顯而易見,如果一個(gè)區(qū)域中大多數(shù)對(duì)象都是朝生夕滅,難以熬過垃圾收集過程的話,那么把它們集中放在一起,每次回收時(shí)只關(guān)注如何保留少量存活而不是去標(biāo)記那些大量將要被回收的對(duì)象(解釋1),就能以較低代價(jià)回收到大量的空間;如果剩下的都是難以消亡的對(duì)象,那把它們集中放在一塊,虛擬機(jī)便可以使用較低的頻率來回收這個(gè)區(qū)域,這就同時(shí)兼顧了垃圾收集的時(shí)間開銷和內(nèi)存的空間有效利用(解釋2)。
解釋1:
解釋2:
????????時(shí)間開銷 ——> 支取掃描1%,比掃描99%快得多;
????????內(nèi)存空間有效利用 ——> 1%移動(dòng)時(shí)不會(huì)直接移動(dòng),而是復(fù)制一份,將復(fù)制移動(dòng)過去,成功后,刪除原有的。
新生代 ——?存放朝生夕死的對(duì)象
老年代 ——?存放新生代回收后還存活的對(duì)象,不容易死的對(duì)象
?? 在新生代中,每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對(duì)象死去,而每次回收后存活的少量對(duì)象,將會(huì)逐步晉升(解釋3)到老年代中存放。
解釋3:
?當(dāng)年齡達(dá)到13時(shí),就進(jìn)入老年代
跨代引用
分代收集有一個(gè)問題:跨代引用
比如說新生代中有一個(gè)對(duì)象A引用老年代的一個(gè)對(duì)象 B,只要老年代的對(duì)象不回收,新生代的這個(gè)對(duì)象也不會(huì)被回收。每次新生代回收時(shí)還是要去掃(判斷A是否需要回收,此時(shí)也需要去判斷A引用的B是否被回收),也不能直接將A放入老年代,因?yàn)榭赡茉贏的年齡為12時(shí),對(duì)象B就被回收了。
解決跨代引用的問題
?? 存在互相引用關(guān)系的兩個(gè)對(duì)象,是應(yīng)該傾向于同時(shí)生存或者同時(shí)消亡的。
舉個(gè)例子,如果某個(gè)新生代對(duì)象存在跨代引用,由于老年代對(duì)象難以消亡,該引用會(huì)使得新生代對(duì)象在收集時(shí)同樣得以存活,進(jìn)而在年齡增長之后晉升到老年代中,這時(shí)跨代引用也隨即被消除了。

雖然這種方法需要在對(duì)象改變引用關(guān)系(如將自己或者某個(gè)屬性賦值)時(shí)維護(hù)記錄數(shù)據(jù)的正確性,會(huì)增加一些運(yùn)行時(shí)的開銷,但比起收集時(shí)掃描整個(gè)老年代來說仍然是劃算的。
垃圾回收算法
一、標(biāo)記-清除算法
標(biāo)記:哪些對(duì)象可以存活或者哪些對(duì)象可以回收
它的主要缺點(diǎn)有兩個(gè):
-
第一個(gè)是執(zhí)行效率不穩(wěn)定。
如果Java堆中包含大量對(duì)象,而且其中大部分是需要被回收的,這時(shí)必須進(jìn)行大量標(biāo)記和清除的動(dòng)作,導(dǎo)致標(biāo)記和清除兩個(gè)過程的執(zhí)行效率都隨對(duì)象數(shù)量增長而降低; -
第二個(gè)是內(nèi)存空間的碎片化問題。
標(biāo)記、清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會(huì)導(dǎo)致當(dāng)以后在程序運(yùn)行過程中需要分配較大對(duì)象時(shí)無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作。
基本不使用
二、標(biāo)記-復(fù)制算法
根據(jù)IBM研究,新生代中的對(duì)象有98%熬不過第一輪收集(普通場(chǎng)景下,無法保證每次都是這樣),因此不需要按照1:1的比例來劃分新生代的內(nèi)存空間,而是使用了8:1:1分配內(nèi)存空間。
?每次進(jìn)行收集時(shí),將前8:1空間的存活對(duì)象一次性復(fù)制到另外的1比例,然后清理掉前8:1空間的朝生夕死的對(duì)象。
?? 內(nèi)存的分配擔(dān)保好比我們?nèi)ャy行借款,如果我們信譽(yù)很好,在98%的情況下都能按時(shí)償還,于是銀行可能會(huì)默認(rèn)我們下一次也能按時(shí)按量地償還貸款,只需要有一個(gè)擔(dān)保人能保證如果我不能還款時(shí),可以從他的賬戶扣錢,那銀行就認(rèn)為沒有什么風(fēng)險(xiǎn)了。
標(biāo)記-復(fù)制算法雖然彌補(bǔ)了標(biāo)記-清除算法的缺點(diǎn),但標(biāo)記-復(fù)制算法還是有自己的缺點(diǎn):
首先就是在對(duì)象存活率較高時(shí)要進(jìn)行較多的復(fù)制操作,效率將會(huì)降低;
還有一種情況,就是在十分之九的的對(duì)象里超過十分之一存活,那么復(fù)制到右邊區(qū)域時(shí)空間大小就不夠了。
為了解決這些,出現(xiàn)了標(biāo)記-整理算法。
三、標(biāo)記-整理算法
標(biāo)記過程仍與標(biāo)記-清除算法相同,但后續(xù)讓所有存活的對(duì)象都向內(nèi)存空間一端移動(dòng),然后直接清理掉邊界以外的內(nèi)存。
弊端:
-
像在老年代這種每次回收都有大量對(duì)象存活區(qū)域,移動(dòng)存活對(duì)象并更新所有引用這些對(duì)象的地方將會(huì)是一種極為負(fù)重的操作,而且這種對(duì)象移動(dòng)操作必須全程暫停用戶應(yīng)用程序(解釋4)才能進(jìn)行 ——> 宕機(jī) stop the world
但不移動(dòng)的話,碎片化問題嚴(yán)重,得不到解決也會(huì)導(dǎo)致性能、存儲(chǔ)量降低。
解釋4:
如果不暫停的話,剛標(biāo)記的時(shí)候只占據(jù)一塊,標(biāo)記完以后整理時(shí)可能就變成了占據(jù)了兩塊。
?? 通常標(biāo)記-清除算法也是需要停頓用戶線程來標(biāo)記、清理可回收對(duì)象的,只是停頓時(shí)間相對(duì)而言要來的短而已。文章來源:http://www.zghlxwxcb.cn/news/detail-659681.html
于是混合式出現(xiàn)了,讓虛擬機(jī)平時(shí)多數(shù)時(shí)間都采用標(biāo)記-清除算法,暫時(shí)容忍內(nèi)存碎片的存在,直到內(nèi)存空間的碎片化程度已經(jīng)大到影響對(duì)象分配時(shí),再采用標(biāo)記-整理算法收集一次,以獲得規(guī)整的內(nèi)存空間。文章來源地址http://www.zghlxwxcb.cn/news/detail-659681.html
到了這里,關(guān)于分代收集 + 垃圾回收算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!