一、YGC和full GC的區(qū)別
只針對(duì)新生代區(qū)域進(jìn)行GC,發(fā)生得非常頻繁,回收速度也很快;
指發(fā)生在老年代的GC,出現(xiàn)了Full GC,經(jīng)常會(huì)伴隨至少一次以上的YGC,速度比YGC慢10倍以上,因?yàn)槔夏甏托律臻g分別是堆空間的2/3,1/3,老年代空間更大,當(dāng)然回收更慢。 二、四大回收算法垃圾回收有四大算法,這四種算法就是確定了這個(gè)對(duì)象是垃圾后,怎么進(jìn)行回收。
對(duì)象被引用時(shí)加一,少一個(gè)引用時(shí)減一,當(dāng)引用為零時(shí),就是垃圾。這種方式的缺點(diǎn)就是每次對(duì)象賦值時(shí)都要維護(hù)引用計(jì)數(shù)器,這個(gè)計(jì)數(shù)器本身也有一定的內(nèi)存消耗;第二個(gè)缺點(diǎn)就是較難處理循環(huán)引用。JVM一般不采用這種方式。
新生代的YGC采用的就是這種算法。上一篇說了,伊甸園區(qū)進(jìn)行YGC后存活的對(duì)象,就會(huì)使用復(fù)制算法復(fù)制到from區(qū),from區(qū)和伊甸園區(qū)再次觸發(fā)YGC后存活的對(duì)象,就會(huì)被復(fù)制到to區(qū)。該算法優(yōu)點(diǎn)是,因?yàn)槭侨P復(fù)制過去的,所以不會(huì)產(chǎn)生碎片,缺點(diǎn)是耗空間,from區(qū)有多大,to區(qū)也得有多大,這兩個(gè)區(qū)大小是一比一;而且,假如某些極端的情況下,比如定義了很多靜態(tài)的對(duì)象,伊甸園區(qū)對(duì)象進(jìn)行YGC時(shí),好多對(duì)象沒被回收,那么要復(fù)制的對(duì)象就會(huì)很多。
老年代采用的一般就是標(biāo)記清除算法,或者是標(biāo)記清除 + 標(biāo)記整理混合實(shí)現(xiàn)。標(biāo)記清除分為兩步,先標(biāo)記出要回收的對(duì)象,然后對(duì)這些被標(biāo)記的對(duì)象統(tǒng)一回。優(yōu)點(diǎn)是不會(huì)浪費(fèi)額外的空間,缺點(diǎn)就是回收后的空間不是連續(xù)的,會(huì)產(chǎn)生內(nèi)存碎片,且分兩步進(jìn)行,比較耗時(shí)。當(dāng)JVM可使用內(nèi)存快被耗盡時(shí),GC線程就會(huì)暫停程序,隨后標(biāo)記要回收的對(duì)象,統(tǒng)一回收后,程序再恢復(fù)運(yùn)行。
上面說了標(biāo)記清除算法不會(huì)浪費(fèi)額外空間,但是會(huì)產(chǎn)生內(nèi)存碎片。所以標(biāo)記整理算法就是比標(biāo)記清除又多了一步,整理那些不連續(xù)的空間(將存活的對(duì)象往一端滑動(dòng),后面的空間就是連續(xù)的了),這樣就沒有內(nèi)存碎片了。缺點(diǎn)就是耗時(shí)。 那么哪種回收算法最好呢?沒有最好,只有最合適。復(fù)制算法省時(shí)間,但是耗空間,標(biāo)記整理算法不耗費(fèi)額外的空間,但是費(fèi)時(shí)間。新生區(qū)因?yàn)閷?duì)象存活率低,所以適合用復(fù)制算法,而老年區(qū)適合用標(biāo)記清除 + 標(biāo)記整理。所以JVM垃圾回收算法又稱為分代回收算法。 掃描二維碼 |
|
|