串行與并行收集器
串行回收: JDK1.5前的默認(rèn)算法 缺點(diǎn)是只有一個(gè)線程焚鲜,執(zhí)行垃圾回收時(shí)程序停止的時(shí)間比較長恤磷。
并行回收: 多個(gè)線程執(zhí)行垃圾回收適合于吞吐量的系統(tǒng)绘雁,回收時(shí)系統(tǒng)會(huì)停止運(yùn)行牧愁。
serial收集器
串行收集器是最古老,最穩(wěn)定以及效率高的收集器红淡,可能會(huì)產(chǎn)生較長的停頓不狮,只使用一個(gè)線程去回收。新生代在旱、老年代使用串行回收摇零;新生代復(fù)制算法、老年代標(biāo)記-壓縮桶蝎;垃圾收集的過程中會(huì)Stop The World(服務(wù)暫停)一個(gè)單線程的收集器驻仅,在進(jìn)行垃圾收集時(shí)候,必須暫停其他所有的工作線程直到它收集結(jié)束登渣。
特點(diǎn):CPU利用率最高噪服,停頓時(shí)間即用戶等待時(shí)間比較長。
適用場(chǎng)景:小型應(yīng)用
通過JVM參數(shù)-XX:+UseSerialGC可以使用串行垃圾回收器胜茧。
ParNew收集器
ParNew收集器其實(shí)就是Serial收集器的多線程版本粘优。新生代并行,老年代串行呻顽;新生代復(fù)制算法敬飒、老年代標(biāo)記-壓縮
參數(shù)控制:-XX:+UseParNewGC ParNew收集器
-XX:ParallelGCThreads 限制線程數(shù)量
parallel 收集器
Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關(guān)注系統(tǒng)的吞吐量芬位。可以通過參數(shù)來打開自適應(yīng)調(diào)節(jié)策略带到,虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)控信息昧碉,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時(shí)間或最大的吞吐量;也可以通過參數(shù)控制GC的時(shí)間不大于多少毫秒或者比例揽惹;新生代復(fù)制算法被饿、老年代標(biāo)記-壓縮
采用多線程來通過掃描并壓縮堆
特點(diǎn):停頓時(shí)間短,回收效率高搪搏,對(duì)吞吐量要求高狭握。
適用場(chǎng)景:大型應(yīng)用,科學(xué)計(jì)算疯溺,大規(guī)模數(shù)據(jù)采集等论颅。
通過JVM參數(shù) XX:+USeParNewGC 打開并發(fā)標(biāo)記掃描垃圾回收器。
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)今妄。
從名字(包含“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)記犬性、重新標(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)記階段稍長一些,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短吹艇。
由于整個(gè)過程中耗時(shí)最長的并發(fā)標(biāo)記和并發(fā)清除過程中惰蜜,收集器線程都可以與用戶線程一起工作,所以總體上來說受神,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)地執(zhí)行抛猖。老年代收集器(新生代使用ParNew)
優(yōu)點(diǎn):并發(fā)收集、低停頓
缺點(diǎn):產(chǎn)生大量空間碎片鼻听、并發(fā)階段會(huì)降低吞吐量
采用“標(biāo)記-清除”算法實(shí)現(xiàn)财著,使用多線程的算法去掃描堆,對(duì)發(fā)現(xiàn)未使用的對(duì)象進(jìn)行回收撑碴。
(1)初始標(biāo)記
(2)并發(fā)標(biāo)記
(3)并發(fā)預(yù)處理
(4)重新標(biāo)記
(5)并發(fā)清除
(6)并發(fā)重置
特點(diǎn):響應(yīng)時(shí)間優(yōu)先撑教,減少垃圾收集停頓時(shí)間
適應(yīng)場(chǎng)景:大型服務(wù)器等。
通過JVM參數(shù) -XX:+UseConcMarkSweepGC設(shè)置
g1收集器
在G1中醉拓,堆被劃分成 許多個(gè)連續(xù)的區(qū)域(region)伟姐。采用G1算法進(jìn)行回收,吸收了CMS收集器特點(diǎn)亿卤。
特點(diǎn):支持很大的堆愤兵,高吞吐量 --支持多CPU和垃圾回收線程
--在主線程暫停的情況下,使用并行收集
--在主線程運(yùn)行的情況下排吴,使用并發(fā)收集
實(shí)時(shí)目標(biāo):可配置在N毫秒內(nèi)最多只占用M毫秒的時(shí)間進(jìn)行垃圾回收
通過JVM參數(shù) -XX:+UseG1GC 使用G1垃圾回收器
注意: 并發(fā)是指一個(gè)處理器同時(shí)處理多個(gè)任務(wù)秆乳。
并行是指多個(gè)處理器或者是多核的處理器同時(shí)處理多個(gè)不同的任務(wù)。
并發(fā)是邏輯上的同時(shí)發(fā)生(simultaneous)钻哩,而并行是物理上的同時(shí)發(fā)生屹堰。