GC(6)、CMS收集器以及参数整理

作者: 编程界的小学生 | 来源:发表于2017-09-08 13:16 被阅读68次

    一、CMS收集器(Concurrent Mark Sweep)
    1、概念
    CMS收集器是一种以获取最短回收停顿时间为目标的收集器。是一种基于“标记-清除”算法来实现的。

    2、CMS步骤

    • (1)初始标记(CMS initial mark)
    • (2)并发标记(CMS concurrent mark)
    • (3)重新标记(CMS remark)
    • (4)并发清除(CMS concurrent sweep)
      其中(1)(3)两步骤仍然会发生Stop-The-World

    3、每个步骤解释

    • (1)初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
    • (2)并发标记:进行GC Roots Tracing(追踪)的过程,就是对无用对象进行标记。
    • (3)重新标记:为了修正并发标记期间用户程序继续运作而导致标记产生变动的那一部分的对象的标记记录。
    • (4)并发清除:清除无用(被标记的)对象。

    4、图示
    CMS收集器的内存回收过程是与用户线程一起并发执行的。

    Paste_Image.png

    5、优点
    (1)并发收集
    (2)尽可能降低停顿
    真的是一个很优秀的垃圾收集器!

    6、缺点
    (1)开头就说了,是标记-清除算法,所以会产生很多碎片,导致连续大内存空间太少。
    (2)清理不彻底。因为在清理阶段,用户线程还在运行,会产生新的垃圾,无法清理,只能等到下一次GC再清理。

    二、G1收集器
    G1是比较前沿的成果,目前不讲解。知道存在这个东西就行了,未来可能会替代CMS。

    三、参数整理

    -XX:+UseSerialGC:在新生代和老年代使用串行收集器
    -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
    -XX:NewRatio:新生代和老年代的比
    -XX:+UseParNewGC:在新生代使用并行收集器
    -XX:+UseParallelGC :新生代使用并行回收收集器
    -XX:+UseParallelOldGC:老年代使用并行回收收集器
    -XX:ParallelGCThreads:设置用于垃圾回收的线程数
    -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
    -XX:ParallelCMSThreads:设定CMS的线程数量
    -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
    -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
    -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
    -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
    -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
    -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
    

    若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
    欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:GC(6)、CMS收集器以及参数整理

        本文链接:https://www.haomeiwen.com/subject/lisgjxtx.html