当使用CMS收集器时,当开始进行收集时,old代的收集过程如下所示:

1、首先jvm根据-XX:CMSInitiatingOccupancyFraction,-XX:+UseCMSInitiatingOccupancyOnly来决定什么时间开CMS始垃圾收集;

1)如果设置了-XX:+UseCMSInitiatingOccupancyOnly,那么只有当old代占用确实达到了-XX:CMSInitiatingOccupancyFraction参数所设定的比例时才会触发cms gc;

2)如果没有设置-XX:+UseCMSInitiatingOccupancyOnly,那么系统第一次会根据-XX:CMSInitiatingOccupancyFraction参数所设定的比例触发,随后会根据统计数据自行决定什么时候触发cms gc;

2、当cms gc开始时,首先的阶段是CMS-initial-mark,此阶段是初始标记阶段,是stop the world阶段,因此此阶段标记的对象只是从root集最直接可达的对象:
     CMS-initial-mark:961330K(1572864K),指标记时,old代的已用空间和总空间

3、其次CMS-concurrent-mark阶段,此阶段是和应用线程并发执行的,所谓并发收集器指的就是这个,主要作用是标记可达的对象

此阶段会打印2条日志:CMS-concurrent-mark-start,CMS-concurrent-mark

4、CMS-concurrent-preclean,此阶段主要是进行一些预清理(也属于concurrent-mark阶段),因为标记和应用线程是并发执行的,因此会有些对象的状态在标记后会改变, 此阶段正是解决这个问题因为之后的Rescan阶段也会stop the world,为了使暂停的时间尽可能的小 ,也需要preclean阶段先做一部分工作以节省时间
     此阶段会打印2条日志:CMS-concurrent-preclean-start,CMS-concurrent-preclean

5、CMS-concurrent-abortable-preclean阶段,加入此阶段的目的是使cms gc更加可控一些(也属于concurrent-mark阶段),作用也是执行一些预清理,以减少Rescan阶段造成应用暂停的时间

此阶段涉及几个参数:
     -XX:CMSMaxAbortablePrecleanTime:当abortable-preclean阶段执行达到这个时间时才会结束
     -XX:CMSScheduleRemarkEdenSizeThreshold(默认2m):控制abortable-preclean阶段什么时候开始执行, 即当eden使用达到此值时,才会开始abortable-preclean阶段
     -XX:CMSScheduleRemarkEdenPenetration(默认50%):控制abortable-preclean阶段什么时候结束执行
      此阶段会打印一些日志如下:
     CMS-concurrent-abortable-preclean-start,CMS-concurrent-abortable-preclean,
      CMS:abort preclean due to time XXX

6、其次是第二个stop the world阶段了,即Rescan阶段,此阶段暂停应用线程,对对象进行重新扫描并标记;

YG occupancy:964861K(2403008K),指执行时young代的情况
       CMS remark:961330K(1572864K),指执行时old代的情况
      此外,还打印出了弱引用处理、类卸载等过程的耗时

7、再下一个阶段是CMS-concurrent-sweep,进行并发的垃圾清理;

8、最后是CMS-concurrent-reset,为下一次cms gc重置相关数据结构。

9、full gc:
有2种情况会触发full gc,在full gc时,整个应用会暂停
   1)concurrent-mode-failure:当cms gc正进行时,此时有新的对象要进行old代,但是old代空间不足造成的
   2)promotion-failed:当进行young gc时,有部分young代对象仍然可用,但是S1或S2放不下,因此需要放到old代,但此时old代空间无法容纳此。

10、影响cms gc时长及触发的参数是以下2个:
        -XX:CMSMaxAbortablePrecleanTime=5000
        -XX:CMSInitiatingOccupancyFraction=80
解决也是针对这两个参数来的,根本的原因是每次请求消耗的内存量过大
解决方式:
 1)针对cms gc的触发阶段,调整-XX:CMSInitiatingOccupancyFraction=50,提早触发cms gc,就可以缓解当old代达到80%,cms gc处理不完,从而造成concurrent mode failure引发full gc
 2)修改-XX:CMSMaxAbortablePrecleanTime=500,缩小CMS-concurrent-abortable-preclean阶段的时间
 3)考虑到cms gc时不会进行compact,因此加入-XX:+UseCMSCompactAtFullCollection
       (cms gc后会进行内存的compact)和-XX:CMSFullGCsBeforeCompaction=4(在full gc4次后会进行compact)参数

Tenured 区并发垃圾回收器CMS实战相关推荐

  1. 垃圾回收器——CMS与G1

    垃圾回收器--CMS与G1 查看JVM所有的参数及默认值 什么是垃圾回收,为什么要有垃圾回收 根可达中的根 安全点与安全区间 内存分代划分,为什么要有内存分代划分 jstat CMS垃圾回收器 CMS ...

  2. 023、JVM实战总结:一步一图:那JVM老年代垃圾回收器CMS工作时,内部又干了些啥?

    1.前文回顾 对象都分配在新生代的Eden区,然后每次垃圾回收之后,存活对象都进入Survivor区,下一次垃圾回收后的存活对象都进入另外一个Survivor区. 2.CMS垃圾回收的基本原理 采用标 ...

  3. JVM垃圾回收器-CMS并发标记清除

    Java8的CMS垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#con ...

  4. 面试官最常问的垃圾回收器CMS

    前言 随着互联网技术的发展,线上用户量的大量增加,性能问题变得尤为重要,我们可以通过增大JVM的各项内存来解决一部分问题,但是这样总是片面的 应该双管齐下,既要从硬件方面变得逐渐强大,底层软件方向也不 ...

  5. JVM垃圾回收器cms详解

    关于serial,parnew,parallel等回收器的介绍可以参考上一篇jvm垃圾回收算法以及垃圾回收器,如何选择_bjzw的博客-CSDN博客 下面具体介绍一下cms,jdk8之后就已经废弃了c ...

  6. 史上最经典垃圾回收器(CMS,G1)详解、适用场景及特点、使用命令

    文章目录 垃圾收集器介绍总结 各个垃圾收集器之间的关系 垃圾收集器使用命令及默认值 详解各个垃圾收集器 Serial ParNew Parallel Scavenge Serial Old Paral ...

  7. jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理

    文章目录 Pre CMS垃圾回收的基本原理 如果Stop the World然后垃圾回收会如何? CMS如何实现系统一边工作的同时进行垃圾回收? 初始标记 并发标记 重新标记 并发清理 对CMS的垃圾 ...

  8. 垃圾回收器(CMS)

    CMS回收器 简介 1. HotSpot在JDK1.5时期推出的一款垃圾收集器(用于老年代): 2. 采用 标记-清除算法: 3. 无法与新生代收集器Parallel Scavenge配合工作(JDK ...

  9. jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点

    文章目录 Pre 并发回收垃圾导致CPU资源紧张 Concurrent Mode Failure问题 内存碎片问题 什么情况下触发老年代GC Pre 上篇文章用一步一图的方式给大家讲清楚了CMS垃圾回 ...

最新文章

  1. 秋招面经来了,收藏!
  2. android launcher
  3. setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
  4. 2018.03.03、android-照虎画猫搭建简易Rest服务器
  5. java访问map_java.map使用
  6. springboot 的启动流程
  7. AndroidStudio中提示:Couldn‘t find meta-data for provider with authority
  8. VTK:Video之FFMPEG
  9. C# 文件流 导入 导出
  10. P2742-二维凸包/圈奶牛Fencing the Cows【凸包】
  11. 数组指针——指向数组的指针(通过指针控制数组)
  12. html生成表格table
  13. 批量删除redis key
  14. python压缩视频文件_python压缩图片和视频
  15. Eplan创建符号详细解说
  16. 酒店短视频营销,是酒店获客引流的重点推广手段之一
  17. MT1308芯片原厂
  18. java hadoop是什么_hadoop是什么语言
  19. 把ipad变成电脑的外接显示屏
  20. 在Linux中安装JKD(详细教学)

热门文章

  1. R 数据分析学习笔记
  2. 使用NNI对DLASeg剪枝的失败记录
  3. COMSOL卡门涡街发电
  4. 项目:图片存储系统(图片服务器)
  5. SVN中英文菜单对照
  6. JNPF 3.4.5 快速开发框架源码目录截图 Gitee代码托管和研发协作平台
  7. JavaWeb实现员工管理系统
  8. PYTHION知识总结和assert利用剑蚁登录
  9. react点击事件onClick
  10. 精准操盘公式 擒庄操盘 通达信趋势操盘抄底主图选股