关于后端:深入浅出JVM十七之并发垃圾收集器CMS

50次阅读

共计 1889 个字符,预计需要花费 5 分钟才能阅读完成。

上篇文章介绍用户线程与 GC 线程并发执行时可能产生的问题以及应用三色标记法演示原始快照和增量更新两种解决方案

这篇文章将次要介绍并发垃圾收集器中的 CMS,其中 CMS 应用增量更新来解决对象隐没问题,如果不理解增量更新的同学能够查看上篇文章深入浅出 JVM(十六)之三色标记法与并发可达性剖析

前言

前文形容过,当 GC 时须要枚举的 GC 根节点须要极短的进展(STW)

而在遍历 GC 援用链时,如果用户线程是进展的,那么不会扭转援用,GC 线程遍历标识即可

但随着堆内存中对象的增多,援用链会越来越长,如果继续让用户线程进展,在某些须要低提早的场景是不现实的

因而心愿能在这个环节让用户线程和 GC 线程可能并发执行,并发执行就会存在扭转对象援用,可能导致对象隐没问题,其中能够应用增量更新和原始快照的形式解决,而 CMS 应用的就是增量更新

Concurrent Mark Sweep

CMS 全称 Concurrent Mark Sweep 并发标记革除收集器

CMS 是 老年代收集器,采纳标记 - 革除算法 ,年老代罕用 ParNew 收集器,以 最短进展工夫 (低提早) 为指标 的收集器

CMS 并没有应用标记 - 整顿算法,因为标记、清理阶段是和用户线程并发执行的,如果应用标记 - 整顿算法可能会导致挪动援用的地位导致出错

执行步骤

  1. 初始标记: 标记 GC Roots 间接关联的对象(STW 工夫极短)
  2. 并发标记: 从 GC Roots 间接关联对象开始遍历整个援用链的过程(耗时长,不须要进展用户线程,用户线程与 GC 线程并发执行)
  3. 从新标记: 应用增量更新防止对象隐没问题,修改并发标记期间改变的对象(须要 STW,耗时比步骤 1 长,比步骤 2 短)
  4. 并发革除: 清理标记阶段判断已死亡的对象、重置状态等(该阶段也是并发执行)

执行图

参数设置

  • -XX:UseConcMarkSweepGC

    • 老年代应用 CMS 垃圾收集器,新生代应用 ParNew 收集器
  • -XX:CMSInitiatingOccupancyFraction

    • 设置老年代应用多少空间时开始垃圾回收

      • 如果设置的太高,不够内存调配,不能满足并发执行,就会解冻用户线程启动 Serial Old 收集器,进展工夫就会变长
      • 如果内存增长迟缓能够设置高一些,如果内存增长很快就要设置低一些 默认 92%
  • -XX:+UseCMSCompactAtFullCollection

    • 指定在 FULL GC 后是否对内存进行压缩整顿
    • 开启后,通过 -XX:CMSFullGCsBeforeCompaction 设置执行多少次 FULL GC 后进行内存压缩整顿
  • -XX:ParallelCMSThreads

    • 设置 GC 线程数量

特点

长处:

  1. 进展工夫短

    只在初始标记,从新标记时 STW

  2. 并发执行

    工夫长的并发标记和并发清理与用户线程,放慢响应速度,晋升用户体验

毛病:

  1. 吞吐量升高

    在处理器核数少时,GC 线程与用户线程并发执行(应用 i -CMS 解决: 缩小 GC 线程独占工夫,垃圾回收工夫变长,对用户线程执行影响变小)

  2. 无奈解决浮动垃圾

    增量更新通过记录新增援用来防止对象隐没问题,可能呈现浮动垃圾(不能在这一次的 GC 中被回收,只能下一次 GC 时被回收)

    CMS 不能等老年代满了再垃圾回收,因为与用户线程并发执行,所以须要留一部分内存

  3. 内存碎片多

    屡次垃圾回收后进行一次标记 - 整顿算法,采纳替补计划 Serial Old

总结

本文依据并发垃圾收集器 CMS 深入浅出的解析 CMS 执行流程、优缺点以及配置参数等

CMS 是一款主打低提早、应用标记 - 革除算法的老年代并发垃圾收集器,年老代常应用 ParNew

CMS 在初始标记时进行 STW,接下来遍历援用链时与用户线程并发执行,而后让用户线程短暂 STW 应用增量更新进行从新标记,最初在并发进行清理、重置等工作

CMS 的特点是在遍历援用链、清理时并发执行,可能使用户线程的进展工夫变短;然而带来吞吐量的升高,并且增量更新会导致浮动垃圾的呈现,因为老年代应用标记 - 革除算法,不整顿内存将会导致大对象无奈存储,替补计划是应用 Serial Old 单线程标记 - 整顿

如果老年代内存不足或须要整顿内存时,会应用 Serial Old 单线程解决,这可能导致提早更高,在高版本中曾经有 G1 等其余垃圾收集器代替 CMS,CMS 在 JDK14 时被移除

最初(一键三连求求拉~)

本篇文章将被支出 JVM 专栏,感觉不错感兴趣的同学能够珍藏专栏哟~

本篇文章笔记以及案例被支出 gitee-StudyJava、github-StudyJava 感兴趣的同学能够 stat 下继续关注喔 \~

有什么问题能够在评论区交换,如果感觉菜菜写的不错,能够点赞、关注、珍藏反对一下 \~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0