JVM 之 CMS 原理

CMS 概述

CMS(Concurrent Mark Sweep) 收集器是一种获取最短回收停顿时间为目标的收集器 基于标记-清除算法 分为4个步骤

  • 初始标记(CMS Initial Mark)
  • 并发标记(CMS concurrent Mark)
  • 重新标记(CMS Remark)
  • 并发清除(CMS concurrent Sweep)

初始标记、重新标记需要 stop the world。

阶段1:初始标记(CMS Initial Mark)

初始标记需要 Stop The World 初始标记用于标记老年代中GC root 能直接关联到的对象,或者被年轻代对象引用的存活对象。

图片来源于## GC Algorithms: Implementations

sql 复制代码
2023-09-17T15:26:55.433+0800: 518583.749: 
[GC (CMS Initial Mark) [1 CMS-initial-mark: 5087358K(6359040K)] 5113671K(10073088K), 0.0036786 secs] 
[Times: user=0 .02 sys=0.00, real=0.01 secs]

注释

  • GC开始的时间,以及相对于JVM启动的时间
  • 初始标记,收集所有GC root,以及直接引用的对象
    • 5087358K _ 当前老年代使用的容量,这里是4.8G
    • 6359040K _ 老年代可用最大容量,这里是6G
    • 5113671K _ 整个堆目前使用的容量
    • 10073088K _ 堆可用容量 9.6G
  • 该阶段时间统计

阶段2:并发标记(CMS concurrent Mark)

根据GC root 遍历老年代,标记所有存活的对象。并不是老年代中所有存活对象都会被标记,并发标记期间,用户程序继续运作而导致标记产生变动。

yaml 复制代码
2023-09-17T15:26:55.438+0800: 518583.754: [CMS-concurrent-mark-start] 
2023-09-17T15:26:55.580+0800: 518583.896: [CMS-concurrent-mark: 0.133/0.143 secs] [Times: user=0.56 sys=0.31, real=0.14 secs] 
  • CMS-concurrent-mark _ 并发标记阶段,遍历老年代标记所有存活对象
  • 0.133/0.143 secs _ 这个阶段持续的时间和时钟时间
  • [Times: user=0.56 sys=0.31, real=0.14 secs] _ 并发阶段意义不大,因为从并发标记开始时间开始计算,包含的不仅仅是并发标记的时间

阶段3: 并发预处理

concurrent-preclean

yaml 复制代码
2023-09-17T15:26:55.580+0800: 518583.896: [CMS-concurrent-preclean-start]
2023-09-17T15:26:55.598+0800: 518583.914: [CMS-concurrent-preclean: 0.017/0.017 secs] [Times: user=0.03 sys=0.02, real=0.02 secs] 

concurrent-abortable-preclean

yaml 复制代码
2023-09-17T15:26:55.598+0800: 518583.914: [CMS-concurrent-abortable-preclean-start]
2023-09-17T15:26:58.248+0800: 518586.564: [CMS-concurrent-abortable-preclean: 2.629/2.650 secs] [Times: user=6.07 sys=2.13, real=2.65 secs] 

阶段4: 重新标记(CMS Remark)

STW

yaml 复制代码
2023-09-17T15:26:58.253+0800: 518586.569: [GC (CMS Final Remark) 
[YG occupancy: 1726006 K (3714048 K)]
2023-09-17T15:26:58.253+0800: 518586.569: [Rescan (para llel) , 0.1338179 secs]
2023-09-17T15:26:58.387+0800: 518586.703: [weak refs processing, 0.0009936 secs]
2023-09-17T15:26:58.388+0800: 518586.704: [class unloa ding, 0.0364321 secs]
2023-09-17T15:26:58.425+0800: 518586.741: [scrub symbol table, 0.0274942 secs]
2023-09-17T15:26:58.452+0800: 518586.768: [scrub string ta ble, 0.0018922 secs]
[1 CMS-remark: 5087358K(6359040K)] 6813364K(10073088K), 0.2012828 secs] [Times: user=1.13 sys=0.00, real=0.20 secs]
  • [YG occupancy: 1726006 K (3714048 K)]------年轻代当前的占用量和容量,这里分别是 1.64G和 3.54G.
  • [1 CMS-remark: 5087358K(6359040K)] 6813364K(10073088K), 0.2012828 secs] ------这个阶段之后,
    • 老年代的使用量和总量,4.85, 6.06G
    • 堆的使用量和总量: 6.49G, 9.6G
    • 这个阶段持续的时间

阶段5:并发清理(CMS concurrent Sweep)

并发执行,清理垃圾对象

yaml 复制代码
2023-09-17T15:26:58.455+0800: 518586.771: [CMS-concurrent-sweep-start]
2023-09-17T15:27:10.444+0800: 518598.760: [CMS-concurrent-sweep: 11.861/11.989 secs] [Times: user=36.43 sys=4.77, real=11.98 secs] 
  • CMS-concurrent-sweep ------ 并发清除阶段,清除没有被标记的对象,回收他们占用的空间
  • 11.861/11.989 secs ------ 这个阶段的持续时间与时钟时间
  • [Times: user=36.43 sys=4.77, real=11.98 secs] ------ 并发阶段意义不大,从并发标记开始的时间开始计算,包含的不仅仅是并发标记的工作

阶段6:并发重置(Concurrent Reset)

并发执行,重置CMS收集器的数据结构,为下一次GC做准备

yaml 复制代码
2023-09-17T15:27:10.445+0800: 518598.761: [CMS-concurrent-reset-start]
2023-09-17T15:27:10.457+0800: 518598.773: [CMS-concurrent-reset: 0.012/0.012 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
  • 0.012/0.012 secs ------ 这个阶段的持续时间和时钟时间
  • 并发阶段意义不大

参考

相关推荐
小_太_阳14 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾17 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者2 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
从善若水2 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
机器之心3 小时前
终于等来能塞进手机的文生图模型!十分之一体量,SnapGen实现百分百的效果
人工智能·后端
机器之心3 小时前
首次!大模型自动搜索人工生命,做出AI科学家的Sakana AI又放大招
人工智能·后端
运维&陈同学3 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
waterme1onY4 小时前
Spring AOP 中记录日志
java·开发语言·笔记·后端