唐山APP小程序网站开发,湖州网站建设培训教程,京东网站设计代码,做网站前期ps 图多大上篇文章介绍用户线程与GC线程并发执行时可能产生的问题以及使用三色标记法演示原始快照和增量更新两种解决方案
这篇文章将主要介绍并发垃圾收集器中的CMS#xff0c;其中CMS使用增量更新来解决对象消失问题#xff0c;如果不了解增量更新的同学可以查看上篇文章深入浅出JV…上篇文章介绍用户线程与GC线程并发执行时可能产生的问题以及使用三色标记法演示原始快照和增量更新两种解决方案
这篇文章将主要介绍并发垃圾收集器中的CMS其中CMS使用增量更新来解决对象消失问题如果不了解增量更新的同学可以查看上篇文章深入浅出JVM十六之三色标记法与并发可达性分析
前言
前文描述过当GC时需要枚举的GC根节点需要极短的停顿STW
而在遍历GC引用链时如果用户线程是停顿的那么不会改变引用GC线程遍历标识即可
但随着堆内存中对象的增多引用链会越来越长如果持续让用户线程停顿在某些需要低延迟的场景是不理想的
因此希望能在这个环节让用户线程和GC线程能够并发执行并发执行就会存在改变对象引用可能导致对象消失问题其中可以使用增量更新和原始快照的方式解决而CMS使用的就是增量更新
Concurrent Mark Sweep
CMS全称Concurrent Mark Sweep 并发标记清除收集器
CMS是老年代收集器采用标记-清除算法年轻代常用ParNew收集器以最短停顿时间(低延迟)为目标的收集器
CMS并没有使用标记-整理算法因为标记、清理阶段是和用户线程并发执行的如果使用标记-整理算法可能会导致移动引用的位置导致出错
执行步骤
初始标记: 标记GC Roots直接关联的对象STW时间极短
并发标记: 从GC Roots直接关联对象开始遍历整个引用链的过程耗时长不需要停顿用户线程用户线程与GC线程并发执行
重新标记: 使用增量更新避免对象消失问题修正并发标记期间改动的对象需要STW耗时比步骤1长比步骤2短
并发清除: 清理标记阶段判断已死亡的对象、重置状态等该阶段也是并发执行 执行图 参数设置
-XX:UseConcMarkSweepGC 老年代使用CMS垃圾收集器新生代使用ParNew收集器 -XX:CMSInitiatingOccupancyFraction 设置老年代使用多少空间时开始垃圾回收 如果设置的太高不够内存分配不能满足并发执行就会冻结用户线程启动Serial Old收集器停顿时间就会变长如果内存增长缓慢可以设置高一些如果内存增长很快就要设置低一些 默认92% -XX:UseCMSCompactAtFullCollection 指定在FULL GC后是否对内存进行压缩整理开启后通过-XX:CMSFullGCsBeforeCompaction设置执行多少次FULL GC后进行内存压缩整理 -XX:ParallelCMSThreads 设置GC线程数量
特点 优点: 停顿时间短 只在初始标记重新标记时STW 并发执行 时间长的并发标记和并发清理与用户线程加快响应速度提升用户体验 缺点: 吞吐量降低 在处理器核数少时GC线程与用户线程并发执行使用i-CMS解决:减少GC线程独占时间垃圾回收时间变长对用户线程执行影响变小 无法处理浮动垃圾 增量更新通过记录新增引用来避免对象消失问题可能出现浮动垃圾不能在这一次的GC中被回收只能下一次GC时被回收 CMS不能等老年代满了再垃圾回收因为与用户线程并发执行所以需要留一部分内存 内存碎片多 多次垃圾回收后进行一次标记-整理算法采用替补方案Serial Old
总结
本文根据并发垃圾收集器CMS深入浅出的解析CMS执行流程、优缺点以及配置参数等
CMS是一款主打低延迟、使用标记-清除算法的老年代并发垃圾收集器年轻代常使用ParNew
CMS在初始标记时进行STW接下来遍历引用链时与用户线程并发执行然后让用户线程短暂STW使用增量更新进行重新标记最后在并发进行清理、重置等工作
CMS的特点是在遍历引用链、清理时并发执行能够使用户线程的停顿时间变短但是带来吞吐量的降低并且增量更新会导致浮动垃圾的出现由于老年代使用标记-清除算法不整理内存将会导致大对象无法存储替补方案是使用Serial Old单线程标记-整理
如果老年代内存不足或需要整理内存时会使用Serial Old 单线程处理这可能导致延迟更高在高版本中已经有G1等其他垃圾收集器代替CMSCMS在JDK14时被移除
最后一键三连求求拉~
本篇文章将被收入JVM专栏觉得不错感兴趣的同学可以收藏专栏哟~
本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~
有什么问题可以在评论区交流如果觉得菜菜写的不错可以点赞、关注、收藏支持一下~
关注菜菜分享更多干货公众号菜菜的后端私房菜 本文由博客一文多发平台 OpenWrite 发布