首页  

JVM CMS 介绍     所属分类 java 浏览量 1086
并发收集器 CMS(Concurrent Mark-Sweep)

以牺牲吞吐量为代价来获得较短的回收停顿时间
适合对延迟有较高要求的交互式应用使用
cms用于老年代回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。
-XX:+UseConcMarkSweepGC

CMS过程:
初始标记(STW initial mark)  
并发标记(Concurrent marking) 
并发预清理(Concurrent precleaning)
重新标记(STW remark)  
并发清理(Concurrent sweeping)
并发重置(Concurrent reset)

STW stop the world ,暂停应用线程




初始标记 :从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。
并发标记 :在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
并发预清理 :查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作
重新标记 :收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯,并处理对象关联。
并发清理 :清理垃圾对象
并发重置 :重置CMS收集器的数据结构,等待下一次垃圾回收。


CMS缺点

需要更大的对空间 GC与应用线程并发运行,需要预留一定的空间
内存碎片 Mark-Sweep 默认不会整理压缩堆空间 
需要消耗cpu 

防止堆碎片引起full gc,CMS阶段进行合并碎片,-XX:+UseCMSCompactAtFullCollection
-XX:+CMSParallelRemarkEnabled 减少remark时间 
-XX:+CMSScavengeBeforeRemark 强制remark之前开始一次minor gc

避免Perm区满引起的full gc,建议开启CMS回收Perm区
-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

打开GC日志

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/logs/gc.log


避免两种fail引起的full gc:Prommotion failed和Concurrent mode failed
Prommotion failed
old区没有足够的空间来容纳从young区晋升的对象
Concurrent mode failed
CMS回收速度慢,完成之前,old区空间被用完 
可以增大old区空间 或者 调小 CMSInitiatingOccupancyFraction

上一篇     下一篇
如何判断一个数是否在40亿个整数中

延迟队列原理及使用场景

JVM CMS 常用参数

各种垃圾收集器的特点及使用场景

顶尖学霸是如何炼成的

程序员段子合集