CMS
介紹
用于對(duì)年老代的回收,目標(biāo)是盡量減少應(yīng)用的暫停時(shí)間,減少full gc發(fā)生的幾率,利用和應(yīng)用程序線(xiàn)程并發(fā)的垃圾回收線(xiàn)程來(lái)標(biāo)記清除年老代。適用于響應(yīng)時(shí)間大于吞吐量?jī)?yōu)先應(yīng)用
原理
初始標(biāo)記(CMS-initial-mark) -> 并發(fā)標(biāo)記(CMS-concurrent-mark) -> 重新標(biāo)記(CMS-remark) -> 并發(fā)清除(CMS-concurrent-sweep) ->并發(fā)重設(shè)狀態(tài)等待下次CMS的觸發(fā)(CMS-concurrent-reset),在1、3階段暫停應(yīng)用,整個(gè)時(shí)間小于200毫秒為優(yōu)。young generation的回收采用的仍然是并行復(fù)制收集器,這個(gè)跟Paralle gc算法是一致的
參數(shù)
-XX:+UseConcMarkSweepGC啟用CMS
-XX:+UseParallelGC:選擇垃圾收集器為并行收集器。此配置僅對(duì)年輕代有效??梢酝瑫r(shí)并行多個(gè)垃圾收集線(xiàn)程,但此時(shí)用戶(hù)線(xiàn)程必須停止。后臺(tái)系統(tǒng)任務(wù)可以使用此 gc。
-XX:+UseParNewGC:設(shè)置年輕代為多線(xiàn)程收集。可與CMS收集同時(shí)使用。在serial基礎(chǔ)上實(shí)現(xiàn)的多線(xiàn)程收集器。
-XX:ParallelCMSThreads=20 CMS線(xiàn)程回收數(shù)
-XX:ParallelGCThreads= N 年輕代線(xiàn)程回收數(shù),默認(rèn)是(ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)
-XX:+UseCMSCompactAtFullCollection CMS是不會(huì)整理堆碎片的,為了防止堆碎片引起full gc,通過(guò)會(huì)開(kāi)啟CMS階段進(jìn)行合并碎片選項(xiàng),開(kāi)啟這個(gè)選項(xiàng)一定程度上會(huì)影響性能,配置適當(dāng)?shù)腃MSFullGCsBeforeCompaction來(lái)調(diào)整性能
-XX:CMSFullGCsBeforeCompaction=1 每次full gc進(jìn)行碎片的合并,以保證新生代的大對(duì)象能分配到老年代
-XX:+CMSParallelRemarkEnabled開(kāi)啟并行remark,減少remark暫停時(shí)間
-XX:+CMSScavengeBeforeRemark強(qiáng)制remark之前開(kāi)始一次minor gc,減少remark的暫停時(shí)間
-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled?避免P區(qū)引起的full gc
-XX:CMSInitiatingOccupancyFraction=80年老代占比超過(guò)xx進(jìn)行CMS收集,年老代增長(zhǎng)較慢可調(diào)大該值,設(shè)置過(guò)高可能導(dǎo)致:Concurrent mode failed(由于CMS回收年老代的速度太慢,導(dǎo)致年老代在CMS完成前就被沾滿(mǎn),引發(fā)full gc)。計(jì)算公式:(Xmn-S0)/Old<=Old(1-F)
-XX:MaxTenuringThreshold 年齡達(dá)到一定閾值被移入老年代