# 什么是CMS
CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,是老年代常用的垃圾回收算法。CMS的工作线程和用户线程可以并发执行,这样收获了较低的STW。如果老年代使用CMS垃圾回收器,需要添加虚拟机参数-”XX:+UseConcMarkSweepGC”。
# 使用场景
GC过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间的停顿。
# CMS原理
GC算法会从GC Root开始,标记所有目前所有可达的对象。
## 1.1.1 GCRoots
GCRoots大致有如下几种:
当前执行函数的局部变量和输入参数
正在工作的线程
被加载类的静态块
JNI(Java Native Interface)引用
## 1.1.4 三色标记算法(Tri-color Marking Algorithm)
三色标记算法的数据结构中包含有三个集合:White Set, Black Set和Gray Set。
白色集合对象:需要被回收的对象。
黑色集合对象:没有对白色集合对象的外部引用,并且是GC Root可达的对象。这些对象将不会被回收。
灰色集合对象:集合中的对象全都是GC Root可达的对象,但是正在扫描或正在等待扫描其对“白色集合对象”的引用,这些对象也不会被回收,并且会在扫描结束之后被移入黑色集合。
在大多数算法实现中,黑色集合初始是空,灰色集合中保存有与GC Roots对象直连的所有老年代对象,白色集合中包含有其他对象。内存中的任意对象在任意时间都仅存在于这三个集合当中的一个。
### 算法步骤:
从灰色集合中取出一个对象放入黑色集合
遍历第1步取出的对象的所有白色集合对象引用,并将它们移入灰色集合。这保证了这个对象和它的引用对象都不会被GC
重复上述两步,直到灰色集合为空
由于非GC Root直接可达的节点都被加入到了White Set,并且对象只能从白色集合移动到灰色集合,从灰色集合移动到黑色集合,所以算法体现了一个重要特性-黑色集合中的对象不会引用到白色集合中的对象。这就保证了在灰色集合为空时,我们可以放心地释放白色空间中的对象。这被称作三色不变式(The Tri-color Invariant)。
# CMS相关JVM参数
-XX:+UseConcMarkSweepGC:激活CMS收集器,默认情况下使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:CMSInitiatingOccupancyFraction={x}:在老年代的空间被占用{x}%时,调用CMS算法对老年代进行垃圾回收。
-XX:CMSFullGCsBeforeCompaction={x}:在进行了{x}次CMS算法之后,对老年代进行一次compaction
-XX:+CMSPermGenSweepingEnabled & -XX:+CMSClassUnloadingEnabled:让CMS默认遍历永久代(Perm区)
-XX:ParallelCMSThreads={x}:设置CMS算法中并行线程的数量为{x}。(默认启动(CPU数量+3) / 4个线程。)
-XX:+ExplicitGCInvokesConcurrent:用户程序中可能出现利用System.gc()触发系统Full GC(将会stop-the-world),利用这个参数可以指定System.gc()直接调用CMS算法做GC。
-XX:+DisableExplicitGC:该参数直接让JVM忽略用户程序中的System.gc()
4. 参考资料
GC算法基础及实现: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
三色标记:https://en.wikipedia.org/wiki/Tracing_garbage_collection#Tri-color_marking
内存管理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