打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
第20课:JVM中CMS收集器解密

内容:

    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.进入重点,在初步设置了一些参数后,例如:

  1.   -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m 
  2.     -XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection 
  3.     -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled 
  4. -XX:SoftRefLRUPolicyMSPerMB=0 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
5.CMS GC
CMS垃圾回收器详解
JVM GC耗时频频升高,这次排查完想说:还有谁?
JDK5.0垃圾收集优化之--Don‘t Pause
Java虚拟机的JVM垃圾回收机制
java - GC垃圾收集器详解(二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服