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

30 篇文章 1 订阅
14 篇文章 1 订阅

内容:

    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 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值