一、分代收集理論
1、三個(gè)假說
弱分代假說:絕大多數(shù)對(duì)象都是朝生夕滅的。
強(qiáng)分代假說:熬過越多次垃圾收集過程的對(duì)象越難以消亡。
????????這兩個(gè)分代假說共同奠定了多款常用的垃圾收集器的一致的設(shè)計(jì)原則:收集器應(yīng)該將Java堆劃分出不同的區(qū)域,然后將回收對(duì)象依據(jù)其年齡(年齡即對(duì)象熬過垃圾收集過程的次數(shù))分配到不同的區(qū)域之中存儲(chǔ)。
? ? ? ? 把分代收集理論具體放到現(xiàn)在的商用Java虛擬機(jī)中里,設(shè)計(jì)者一般至少會(huì)把Java堆劃分成新生代和老年代兩個(gè)區(qū)域。
新生代和老年代:每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對(duì)象死去,而每次回收后存活的少量對(duì)象,將會(huì)逐步晉升到老年代中存放。
每次回收進(jìn)行后,沒有被回收的對(duì)象年齡加1,加到一定次數(shù)(一般是13),就會(huì)進(jìn)入老年代。
????????如果一個(gè)區(qū)域中大多數(shù)對(duì)象都是朝生夕滅,難以熬過垃圾收集過程的話,那么把它們集中放在一起,每次回收時(shí)只關(guān)注如何保留少量存活而不是去標(biāo)記那些大量將要被回收的對(duì)象,就能以較低代價(jià)回收到大量的空間;如果剩下的都是難以消亡的對(duì)象,那把它們集中放在一塊,虛擬機(jī)便可以使用較低的頻率來回收這個(gè)區(qū)域,這就同時(shí)兼顧了垃圾收集的時(shí)間開銷和內(nèi)存的空間有效利用。
????????跨代引用問題:新生代引用了老年代的對(duì)象,老年代不消亡,新生代就不消亡,但是每次回收還需要掃描,看老年代有沒有被回收,需要遍歷老年代所有對(duì)象,增加內(nèi)存壓力,讓新生代年齡加1,當(dāng)老年代消亡時(shí),新生代也消亡了。
????????依據(jù)這條假說,我們就不應(yīng)再為了少量的跨代引用去掃描整個(gè)老年代,也不必浪費(fèi)空間專門記錄 每一個(gè)對(duì)象是否存在及存在哪些跨代引用, 只需在新生代上建立一個(gè)全局的數(shù)據(jù)結(jié)構(gòu) (該結(jié)構(gòu)被稱為“記憶集”, Remembered Set ), 這個(gè)結(jié)構(gòu)把老年代劃分成若干小塊,標(biāo)識(shí)出老年代的哪一塊內(nèi)存會(huì)存在跨代引用 。此后當(dāng)發(fā)生Minor GC 時(shí),只有 包含了跨代引用的小塊內(nèi)存里的對(duì)象才會(huì)被加入到GC Roots進(jìn)行掃描 。雖然這種方法需要在對(duì)象改變引用關(guān)系(如將自己或者某個(gè)屬性賦值)時(shí)維護(hù)記錄數(shù)據(jù)的正確性,會(huì)增加一些運(yùn)行時(shí)的開銷,但比起收集時(shí)掃描整個(gè)老年代來說仍然是劃算的。
2、部分收集和整堆收集
- 新生代收集(Minor GC/Young GC):指目標(biāo)只是新生代的垃圾收集。
- 老年代收集(Major GC/Old GC):指目標(biāo)只是老年代的垃圾收集。目前只有CMS收集器會(huì)有單獨(dú)收集老年代的行為。
- 混合收集(Mixed GC):指目標(biāo)是收集整個(gè)新生代以及部分老年代的垃圾收集。目前只有G1收集器會(huì)有這種行為。
整堆收集(Full GC):收集整個(gè)Java堆和方法區(qū)的垃圾收集。
二、垃圾回收算法
1、標(biāo)記-清除算法
分為標(biāo)記和清除兩個(gè)階段。后續(xù)大部分算法也是以它為基礎(chǔ)。
標(biāo)記所有需要回收的對(duì)象,然后統(tǒng)一回收。
反過來也可以。
標(biāo)記所有存活的對(duì)象,回收沒有標(biāo)記的。
缺點(diǎn):
1.程序效率不穩(wěn)定:當(dāng)Java堆中包含大量對(duì)象,而其中大部分是需要被回收的,這時(shí)必須進(jìn)行大量標(biāo)記和清除動(dòng)作,導(dǎo)致標(biāo)記和清除兩個(gè)過程的執(zhí)行效率都隨對(duì)象數(shù)量的增長(zhǎng)而降低。
2.內(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)作。
2、標(biāo)記-復(fù)制算法
優(yōu)點(diǎn):解決碎片化問題,實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行高效。
缺點(diǎn):可用內(nèi)存縮小為原來的一半。
3、標(biāo)記-整理算法
針對(duì)老年代,其中的標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向內(nèi)存空間一端移動(dòng),然后直接清理掉邊界以外的內(nèi)存。
優(yōu)點(diǎn):1.移動(dòng)完會(huì)使內(nèi)存更加規(guī)整
? ? ? ? ? 2.如果老年代多,基本上都不移動(dòng)
缺點(diǎn):1.如果不應(yīng)用于老年代,需要移動(dòng)的對(duì)象過多就會(huì)消耗大量資源
? ? ? ? ? 2.移動(dòng)時(shí)必須暫停所有程序
文章來源:http://www.zghlxwxcb.cn/news/detail-658440.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-658440.html
到了這里,關(guān)于JVM——分代收集理論和垃圾回收算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!