内容:
1.CMS收集器的解析
2.CMS收集器的使用
一、CMS收集器的解析
1.CMS(Concurrent Mark Sweep) 并发收集,低停顿,适合响应时间敏感的应用使用。
2.CMS垃圾收集阶段:
CMS-Initial mark(初始标记):标记GC Roots能够关联到的对象。stop-the-world,暂停从root对象开始标记存活的对象。
CMS-Concurrent mark(并发标记):GC Roots tracing,此时业务线程仍在运行,暂停是在并发标记之后, 暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。
CMS-remark(重新标记):重新标记处理并发标记过程中因为用户程序同时运行而导致标记产生变动的对象的标记记录。stop-the-world。
CMS-Concurrent sweep(并发清除):清除无用对象。
CMS-concurrent-reset(并发重设):并发重设状态等待下次CMS的触发
二、CMS收集器的使用
1.启用CMS:-XX:+UseConcMarkSweepGC。
2.CMS默认启动的回收线程数目是 (ParallelGCThreads + 3)/4) ,如果你需要明确设定,可以通过-XX:ParallelCMSThreads=20来设定,其中ParallelGCThreads是年轻代的并行收集线程数
3.CMS是不会整理堆碎片的,因此为了防止堆碎片引起Full GC,通过会开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection,开启这个选项一定程度上会影响性能。
4.为了减少第二次暂停的时间,开启并行remark: -XX:+CMSParallelRemarkEnabled。如果remark还是过长的话,可以开启-XX:+CMSScavengeBeforeRemark选项,强制remark之前开始一次Minor GC,减少remark的暂停时间,但是在remark之后也将立即开始又一次Minor GC。
5.为了避免Perm区满引起的Full GC,建议开启CMS回收Perm区选项:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
6.默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:
-XX:CMSInitiatingOccupancyFraction=80
这里修改成80%沾满的时候才开始CMS回收。
7.年轻代的并行收集线程数默认是(cpu <= 8) ? cpu : 3 + ((cpu * 5) / 8),如果你希望降低这个线程数,可以通过-XX:ParallelGCThreads= N 来调整。
8.进入重点,在初步设置了一些参数后,例如:
-server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m
-XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled
-XX:SoftRefLRUPolicyMSPerMB=0