深入分析CMS垃圾收集器原理
前文已经讲过,CMS是老年代垃圾收集器,在收集过程中可以与用户线程并发操作。它可以与Serial收集器和Parallel New收集器搭配使用。CMS牺牲了系统的吞吐量来追求收集速度,适合追求垃圾收集速度的服务器上。
CMS相关参数
| 参数 | 类型 | 默认值 | 作用 |
|---|---|---|---|
| -XX:+UseConcMarkSweepGC | boolean | false | 老年代采用CMS收集器收集 |
| –XX:ParallelGCThreads=n | int | (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8) | 老年代采用CMS收集器收集 |
| -XX:CMSInitiatingOccupancyFraction | int | 92 | 年代堆空间的使用率。比如value=75意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。 |
| -XX:+UseCMSInitiatingOccupancyOnly | boolean | false | 只用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整 |
触发条件
周期性GC
由后台线程ConcurrentMarkSweepThread循环判断(默认2s)是否需要触发。
如果没有设置-XX:+UseCMSInitiatingOccupancyOnly,虚拟机会根据收集的数据决定是否触发
老年代使用率达到阈值 CMSInitiatingOccupancyFraction,默认92%。
永久代的使用率达到阈值 CMSInitiatingPermOccupancyFraction,默认92%,前提是开启 CMSClassUnloadingEnabled。
新生代的晋升担保失败。
主动触发
YGC过程发生Promotion Failed,进而对老年代进行回收
比如执行了System.gc(),前提是没有参数ExplicitGCInvokesConcurrent







