Stop The World:不管選擇哪種GC算法,stop-the-world都是不可避免的。Stop-the-world意味著從應(yīng)用中停下來并進(jìn)入到GC執(zhí)行過程中去。一旦Stop-the-world發(fā)生,除了GC所需的線程外,其他線程都將停止工作,中斷了線程直到GC任務(wù)結(jié)束才繼續(xù)它們的任務(wù)。GC調(diào)優(yōu)通常就是為了改善stop-the-world的時(shí)間。


CMS收集器

一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,CMS收集器是基于"標(biāo)記-清除"(mark-sweep)算法實(shí)現(xiàn)的。


整個(gè)過程分為四個(gè)步驟:

1. 初始標(biāo)記 (Stop the World事件CPU停頓很短) 僅標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快;

2. 并發(fā)標(biāo)記 (收集垃圾跟用戶線程一起執(zhí)行) 初始標(biāo)記和重新標(biāo)記仍然需要“stop the world”,并發(fā)標(biāo)記過程就是進(jìn)行GC Roots Tracing的過程;

3. 重新標(biāo)記 (Stop the World事件 CPU停頓,比初始標(biāo)記稍微長,遠(yuǎn)比并發(fā)標(biāo)記短)修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍長一些,但遠(yuǎn)比并發(fā)標(biāo)記時(shí)間短

4. 并發(fā)清理 -清除算法;

  整個(gè)過程中耗時(shí)最長的并發(fā)標(biāo)記和并發(fā)清除過程收集器線程都可以與用戶線程一起工作,所以,從總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)執(zhí)行的。

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

1.并發(fā)收集

2.低停頓

缺點(diǎn)

1.CMS收集器對(duì)CPU資源非常敏感

在并發(fā)階段,雖然不會(huì)導(dǎo)致用戶線程停頓,但是會(huì)因?yàn)檎加昧艘徊糠志€程使應(yīng)用程序變慢,總吞吐量會(huì)降低,為了解決這種情況,虛擬機(jī)提供了一種“增量式并發(fā)收集器”的CMS收集器變種,就是在并發(fā)標(biāo)記和并發(fā)清除的時(shí)候讓GC線程和用戶線程交替運(yùn)行,盡量減少GC 線程獨(dú)占資源的時(shí)間,這樣整個(gè)垃圾收集的過程會(huì)變長,但是對(duì)用戶程序的影響會(huì)減少。(效果不明顯,不推薦)

2.CMS處理器無法處理浮動(dòng)垃圾

CMS在并發(fā)清理階段線程還在運(yùn)行,伴隨著程序的運(yùn)行自然也會(huì)產(chǎn)生新的垃圾,這一部分垃圾產(chǎn)生在標(biāo)記過程之后,CMS無法再當(dāng)次過程中處理,所以只有等到下次gc時(shí)候在清理掉,這一部分垃圾就稱作“浮動(dòng)垃圾” ,

3.CMS是基于“標(biāo)記--清除”算法實(shí)現(xiàn)的,所以在收集結(jié)束的時(shí)候會(huì)有大量的空間碎片產(chǎn)生。空間碎片太多的時(shí)候,將會(huì)給大對(duì)象的分配帶來很大的麻煩,往往會(huì)出現(xiàn)老年代還有很大的空間剩余,但是無法找到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象的,只能提前觸發(fā) full gc。 為了解決這個(gè)問題,CMS提供了一個(gè)開關(guān)參數(shù),用于在CMS頂不住要進(jìn)行full gc的時(shí)候開啟內(nèi)存碎片的合并整理過程,內(nèi)存整理的過程是無法并發(fā)的,空間碎片沒有了,但是停頓的時(shí)間變長了。


G1(Garbage First)

優(yōu)先處理那些垃圾多的內(nèi)存塊,G1只有并發(fā)標(biāo)記才不會(huì)stop-the-world 其他都會(huì)停下來

步驟:

1、初始標(biāo)記(stop the world事件 CPU停頓只處理垃圾);

2、并發(fā)標(biāo)記(與用戶線程并發(fā)執(zhí)行);(不會(huì)觸發(fā)stop the world事件)

3、最終標(biāo)記(stop the world事件 ,CPU停頓處理垃圾);

4、篩選回收(stop the world事件 根據(jù)用戶期望的GC停頓時(shí)間回收); (注意:CMS 在這一步不需要stop the world)

與其他GC收集器相比,G1具備如下特點(diǎn):

1、并行于并發(fā):G1能充分利用CPU、多核環(huán)境下的硬件優(yōu)勢,使用多個(gè)CPU(CPU或者CPU核心)來縮短Stop-The-World停頓時(shí)間。部分其他收集器原本需要停頓??Java??線程執(zhí)行的GC動(dòng)作,G1收集器仍然可以通過并發(fā)的方式讓java程序繼續(xù)執(zhí)行。

2、分代收集:雖然G1可以不需要其他收集器配合就能獨(dú)立管理整個(gè)GC堆,但是還是保留了分代的概念。它能夠采用不同的方式去處理新創(chuàng)建的對(duì)象和已經(jīng)存活了一段時(shí)間,熬過多次GC的舊對(duì)象以獲取更好的收集效果。

3、空間整合:與CMS的“標(biāo)記--清理”算法不同,G1從整體來看是基于“標(biāo)記-整理”算法實(shí)現(xiàn)的收集器;從局部上來看是基于“復(fù)制”算法實(shí)現(xiàn)的

4、可預(yù)測的停頓:這是G1相對(duì)于CMS的另一個(gè)大優(yōu)勢,降低停頓時(shí)間是G1和CMS共同的關(guān)注點(diǎn),但G1除了追求低停頓外,還能建立可預(yù)測的停頓時(shí)間模型,能讓使用者明確指定在一個(gè)長度為M毫秒的時(shí)間片段內(nèi)。