cms(concurrent mark sweep)回收器
它使用的是標(biāo)記清除算法,同時(shí)又是一個(gè)使用多線程并行回收的垃圾回收器。
cms主要工作步驟
cms工作時(shí)主要步驟有初始標(biāo)記、并發(fā)標(biāo)記、預(yù)清理、重新標(biāo)記、并發(fā)清除和并發(fā)重置。其中初始標(biāo)記和重新標(biāo)記是獨(dú)占系統(tǒng)資源的,而預(yù)清理、并發(fā)標(biāo)記、并發(fā)清除和并發(fā)重置是可以和用戶線程一起執(zhí)行的。因此它可以在應(yīng)用程序運(yùn)行過程中進(jìn)行垃圾回收。
根據(jù)標(biāo)記清除算法,初始標(biāo)記、并發(fā)標(biāo)記和重新標(biāo)記都是為了標(biāo)記出需要回收的對象。并發(fā)清理則是在標(biāo)記完成后,正是回收垃圾對象。并發(fā)重置是指在垃圾回收完成后,重新初始化cms數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù),為下一次垃圾回收做好準(zhǔn)備。
在整個(gè)cms回收過程中,默認(rèn)情況下,在并發(fā)標(biāo)記之后,會(huì)有一個(gè)預(yù)清理的操作(也可以設(shè)置參數(shù)-xx:cmsprecleaningenabled,不進(jìn)行預(yù)清理)。預(yù)清理是并發(fā)的,除了為正式清理做準(zhǔn)備和檢查以外,預(yù)清理還會(huì)嘗試控制一次停頓時(shí)間。由于重新標(biāo)記是獨(dú)占cpu的,如果新生代gc發(fā)生后立即觸發(fā)一次重新標(biāo)記,那么一次停頓時(shí)間可能很長。為了避免這種情況,預(yù)清理時(shí),會(huì)可以等待一次新生代gc的發(fā)生,然后根據(jù)歷史性能數(shù)據(jù)預(yù)測一下新生代gc可能發(fā)生的時(shí)間,然后在當(dāng)前時(shí)間和預(yù)測時(shí)間的中間時(shí)刻,進(jìn)行重新標(biāo)記。這樣,最大程度上避免新生代gc和重新標(biāo)記重合,盡可能減少一次停頓時(shí)間。
cms主要參數(shù)設(shè)置
-xx:+useconcmarksweepgc啟用cms回收器
-xx:concgcthreads 設(shè)置并發(fā)線程數(shù)量
-xx:cmsinitiatingoccupancyfraction 設(shè)置當(dāng)老年代使用率達(dá)到n時(shí),執(zhí)行一次cms回收。
-xx:+usecmscompactatfullcollection cms在垃圾收集完成后,進(jìn)行一次碎片整理。
-xx:cmsfullgcsbeforecompaction 設(shè)置當(dāng)進(jìn)行n次cms回收后進(jìn)行一次內(nèi)存壓縮。
-xx:+cmsclassunloadingenabled 使用cms機(jī)制回收perm區(qū)class數(shù)據(jù)