Serial 收集器
單線程收集器箭启,但它的“單線程”的意義并不僅僅說明它只會(huì)使用一個(gè)CPU或者一條收集線程去完成垃圾收集工作,最重要的是在它進(jìn)行垃圾收集時(shí)哥蔚,必須暫停其他所有的工作線程伞梯,直到它收集結(jié)束【笞玻“stop the world”這個(gè)名字也許聽起來挺酷讲仰,但這項(xiàng)工作實(shí)際上是由虛擬機(jī)在后臺(tái)自動(dòng)發(fā)起和自動(dòng)完成的,在用戶不可見的情況下把用戶正常工作的線程全部停掉痪蝇,這對(duì)很多應(yīng)用來說都是難以承受的鄙陡。讀者不妨試想一下冕房,要是你的計(jì)算機(jī)每運(yùn)行一個(gè)小時(shí)就會(huì)暫停相應(yīng)5分鐘,你會(huì)有什么樣的心情趁矾?
- 優(yōu)點(diǎn)
簡(jiǎn)單高效(與其他收集器的單線程比)耙册,對(duì)于限定單個(gè)CPU的環(huán)境來說,Serial收集器由于沒有線程交互的開銷毫捣,專心做垃圾收集自然可以獲得最高的單線程收集效率详拙。
ParNew 收集器
ParNew收集器其實(shí)就是Serial收集器的多線程版本。除了使用多條線程進(jìn)行垃圾收集之外培漏,其余行為包括Serial收集器可用的所有控制參數(shù)溪厘、收集算法、Stop The World牌柄、對(duì)象分配規(guī)則畸悬、回收策略等都與Serial收集器完全一致。
ParNew 收集器除了多線程收集之外珊佣,其他與Serial收集器相比并沒有太多創(chuàng)新之處蹋宦,但它卻是許多運(yùn)行在Server模式下的虛擬機(jī)中首選的新生代收集器,其中有一個(gè)與性能無關(guān)咒锻,但最重要的原因是冷冗,除了Serial收集器外,目前只有它能與CMS收集器配合工作惑艇。ParNew收集器也是使用-XX:+UseConcMarkSweepGC選項(xiàng)后的默認(rèn)新生代收集器蒿辙。
CMS 收集器
CMS(Concurrent Mark Sweep) 收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。目前很大一部分的 java 應(yīng)用幾種在互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上滨巴,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度思灌,希望系統(tǒng)停頓時(shí)間最短,以給用戶帶來較好的體驗(yàn)恭取。CMS收集器就非常符合這類應(yīng)用的需求泰偿。
從名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的蜈垮,它的運(yùn)作過程相對(duì)于前面幾種收集器來說更復(fù)雜一些耗跛,整個(gè)過程分為4個(gè)步驟,包括:
初始標(biāo)記(CMS initial mark)
并發(fā)標(biāo)記 (CMS concurrent mark)
重新標(biāo)記(CMS remark)
-
并發(fā)清除(CMS concurrent sweep)
其中攒发,初始標(biāo)記调塌、并發(fā)標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”。初始標(biāo)記僅僅是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象惠猿,速度很開羔砾,并發(fā)標(biāo)記階段就是進(jìn)行GC Roots Tracing 的過程,而重新標(biāo)記則是為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的暫停時(shí)間一般會(huì)比初始標(biāo)記階段稍長(zhǎng)一些蜒茄,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。
由于整個(gè)過程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過程收集器線程都可以和用戶線程一起工作餐屎,因此檀葛,從總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)執(zhí)行的腹缩。
缺點(diǎn)
- CMS收集器對(duì)CPU資源非常敏感
- CMS收集器無法處理浮動(dòng)垃圾
- CMS是一款基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器屿聋,會(huì)產(chǎn)生大量空間碎片〔厝担空間碎片過多時(shí)润讥,將會(huì)給大對(duì)象分配帶來很大麻煩,往往出現(xiàn)老年代還有很大空間剩余盘寡,但是無法找到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象楚殿,不得不提前出發(fā)一次Full GC。為了解決這個(gè)問題竿痰,CMS收集器提供了一個(gè)-XX:+UseCMSCompactAtFullCollection開關(guān)參數(shù)脆粥,用于在CMS收集器頂不住要進(jìn)行FullGC時(shí)開啟內(nèi)存碎片的合并整理過程,內(nèi)存整理的過程是無法并發(fā)的影涉,空間碎片問題沒有了变隔,但停頓時(shí)間不得不變長(zhǎng)。虛擬機(jī)設(shè)計(jì)者還提供了另外一個(gè)參數(shù)-XX:CMSFullGCsBeforeCompaction蟹倾,這個(gè)參數(shù)是用于設(shè)置多少次不壓縮的Full GC后匣缘,跟著來一次帶壓縮的(默認(rèn)值為0,表示每次進(jìn)入Full GC時(shí)都要進(jìn)行碎片整理)鲜棠。