# 什么是CMS
CMS全稱?Concurrent Mark Sweep阳懂,是一款并發(fā)的梅尤、使用標(biāo)記-清除算法的垃圾回收器,是老年代常用的垃圾回收算法岩调。CMS的工作線程和用戶線程可以并發(fā)執(zhí)行巷燥,這樣收獲了較低的STW。如果老年代使用CMS垃圾回收器号枕,需要添加虛擬機參數(shù)-”XX:+UseConcMarkSweepGC”缰揪。
# 使用場景
GC過程短暫停,適合對時延要求較高的服務(wù)堕澄,用戶線程不允許長時間的停頓邀跃。
# CMS原理
GC算法會從GC Root開始,標(biāo)記所有目前所有可達的對象蛙紫。
## 1.1.1 GCRoots
GCRoots大致有如下幾種:
當(dāng)前執(zhí)行函數(shù)的局部變量和輸入?yún)?shù)
正在工作的線程
被加載類的靜態(tài)塊
JNI(Java Native Interface)引用
## 1.1.4 三色標(biāo)記算法(Tri-color Marking Algorithm)
三色標(biāo)記算法的數(shù)據(jù)結(jié)構(gòu)中包含有三個集合:White Set, Black Set和Gray Set拍屑。
白色集合對象:需要被回收的對象。
黑色集合對象:沒有對白色集合對象的外部引用坑傅,并且是GC Root可達的對象僵驰。這些對象將不會被回收。
灰色集合對象:集合中的對象全都是GC Root可達的對象唁毒,但是正在掃描或正在等待掃描其對“白色集合對象”的引用蒜茴,這些對象也不會被回收,并且會在掃描結(jié)束之后被移入黑色集合浆西。
在大多數(shù)算法實現(xiàn)中粉私,黑色集合初始是空,灰色集合中保存有與GC Roots對象直連的所有老年代對象近零,白色集合中包含有其他對象诺核。內(nèi)存中的任意對象在任意時間都僅存在于這三個集合當(dāng)中的一個。
### 算法步驟:
從灰色集合中取出一個對象放入黑色集合
遍歷第1步取出的對象的所有白色集合對象引用久信,并將它們移入灰色集合窖杀。這保證了這個對象和它的引用對象都不會被GC
重復(fù)上述兩步,直到灰色集合為空
由于非GC Root直接可達的節(jié)點都被加入到了White Set裙士,并且對象只能從白色集合移動到灰色集合入客,從灰色集合移動到黑色集合,所以算法體現(xiàn)了一個重要特性-黑色集合中的對象不會引用到白色集合中的對象腿椎。這就保證了在灰色集合為空時桌硫,我們可以放心地釋放白色空間中的對象。這被稱作三色不變式(The Tri-color Invariant)酥诽。
# CMS相關(guān)JVM參數(shù)
-XX:+UseConcMarkSweepGC:激活CMS收集器鞍泉,默認(rèn)情況下使用ParNew + CMS +? Serial Old的收集器組合進行內(nèi)存回收,Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗后的后備收集器使用肮帐。
-XX:CMSInitiatingOccupancyFraction={x}:在老年代的空間被占用{x}%時咖驮,調(diào)用CMS算法對老年代進行垃圾回收。
-XX:CMSFullGCsBeforeCompaction={x}:在進行了{x}次CMS算法之后训枢,對老年代進行一次compaction
-XX:+CMSPermGenSweepingEnabled & -XX:+CMSClassUnloadingEnabled:讓CMS默認(rèn)遍歷永久代(Perm區(qū))
-XX:ParallelCMSThreads={x}:設(shè)置CMS算法中并行線程的數(shù)量為{x}托修。(默認(rèn)啟動(CPU數(shù)量+3) / 4個線程。)
-XX:+ExplicitGCInvokesConcurrent:用戶程序中可能出現(xiàn)利用System.gc()觸發(fā)系統(tǒng)Full GC(將會stop-the-world)恒界,利用這個參數(shù)可以指定System.gc()直接調(diào)用CMS算法做GC睦刃。
-XX:+DisableExplicitGC:該參數(shù)直接讓JVM忽略用戶程序中的System.gc()
4. 參考資料
GC算法基礎(chǔ)及實現(xiàn):https://plumbr.eu/handbook/what-is-garbage-collection
Oracle文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
CMS算法:http://insightfullogic.com/2013/May/07/garbage-collection-java-3/
GC Tuning:https://plumbr.eu/handbook/gc-tuning-measuring
三色標(biāo)記:https://en.wikipedia.org/wiki/Tracing_garbage_collection#Tri-color_marking
內(nèi)存管理wiki:http://www.memorymanagement.org/glossary/
Rednaxelafx’s Blog:http://rednaxelafx.iteye.com/blog/362738
rit GC資料:https://www.cs.rit.edu/~ark/lectures/gc/index.html
memory barrier:https://www.kernel.org/doc/Documentation/memory-barriers.txt