CMS的整理
CMS是HotSpot VM的server模式下的垃圾收集器,主要作用在Old,Young的回收主要还是使用Paraell收集器
CMS设计的目的是low pause time,垃圾收集过程包含4步:
<!--[if !supportLists]-->1. <!--[endif]-->初始标记(并行,STW),对Old进行第一次标记,找出所以root 直接关联的live对象
<!--[if !supportLists]-->2. <!--[endif]-->扫描(并行,不STW),扫描对象的graph,标记live对象
<!--[if !supportLists]-->3. <!--[endif]-->remark(并行,STW),重新扫描root开始的对象graph,重新标记
<!--[if !supportLists]-->4. <!--[endif]-->sweep(并行,不STW),清理,不压缩
<!--[if !supportLists]-->5. <!--[endif]-->调整heap大小(并行),通常-xms和-xmx一样大,不进行这步
CMS不压缩,会产生碎片,同时不能与Paraell New(Young收集器)一起使用,对于Young回收效率较低
CMS的启动:根据参数-XX:CMSInitiatingOccupancyFraction=<N>
,N是0-100的值,
表示当heap内存使用达到多少的时候启动CMS
jdk8中,推荐配置:
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode \
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
i-cms,在jdk8中存在,作用是可以增量的使用CMS,即在标记过程中,暂停回收进程,启动应用程序,之后在重新启动CMS线程,可以增量标记(不用重新开始),在jdk8中i-cms将标记过程切分成一个个小块,在young回收的同时进行
相关命令行参数:
Description | 1.5及1.5之前 | 1.6及1.6之后 | |
-XX:+CMSIncrementalMode | 启动i-cms,同时-XX:+UseConcMarkSweepGC必须启用 | disabled | disabled |
-XX:+CMSIncrementalPacing | 启动i-cms的节奏自调(根据jvm自己) | disabled | disabled |
-XX:CMSIncrementalDutyCycle=<N> | 在minor回收时,允许i-cms运行时间占比(与CMSIncrementalPacing互斥) | 50 | 10 |
-XX:CMSIncrementalDutyCycleMin=<N> | 最小占用时间 | 10 | 0 |
-XX:CMSIncrementalSafetyFactor=<N> | 用于i-cms自我调整的参数0-100 | 10 | 10 |
-XX:CMSIncrementalOffset=<N> | 用于i-cms自我调整的参数0-100 | 0 | 0 |
-XX:CMSExpAvgFactor=<N> | 用于i-cms自我调整的参数0-100 | 25 |
jdk1.5及之前的,推荐参数配置
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode \
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps \
-XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0
-XX:CMSIncrementalDutyCycle=10
trouble shooting
Concurrent Mode Failure:CMS的一种失败情况,是指在CMS完成之前,heap就full了
OutOfMemoryError: 98%的时间被用来GC,只有2%的空间被释放的情况下,抛出
一般调整措施:
Options | |
1. 调整启动CMS的因子 | -XX:CMSIncrementalSafetyFactor=<N> |
2. 调整最小启动间隔 | -XX:CMSIncrementalDutyCycleMin=<N> |
3. 不使用自动pacing,设置固定值 | -XX:-CMSIncrementalPacing -XX:CMSIncrementalDutyCycle=<N> |