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