CMS(Concurrent Mark Sweep)垃圾收集器是以“最短的停顿”著称的垃圾回收器,因此也是 JDK 9 之前使用最广泛的垃圾回收器之一。那么,问题来了,为什么 CMS 能实现最短停顿时间?CMS 垃圾回收器的工作原理又是啥呢?接下来,我们一起来看。

CMS 工作原理

CMS 之所以能实现最短停顿时间是和它的工作原理分不开的,它们存在因果关联关系,因为 CMS 的工作原理,所以决定了 CMS 能实现最短的停顿时间

“最短停顿时间”指的是垃圾回收过程中,应用程序暂停的时间尽可能短。也就是在垃圾回收时,Stop The World(STW,全局停顿)时间要尽量短,因为只有 STW 够短,那么应用程序才能更快的执行。

那么 CMS 工作原理是啥呢?

CMS 垃圾回收器执行步骤分为以下两步:

  1. 标记
  2. 清除

而在以上过程中,“标记”阶段是需要大量时间的,反而“清除”需要的时间比较短(因为清除只需要把垃圾对象删除“回收”即可)。

那怎么才能提升整体的执行效率,保证最短的停顿时间呢?

于是 CMS 设计者开始动脑子了,这时候有人就提出:既然“标记”阶段比较费时,那我们就将“标记”阶段分阶段处理好了,并且最好能让他能与应用线程一起执行,这样就不需要 STW(全局停顿)了,那么停顿时间不久短了嘛?

因此 CMS 的设计者将垃圾回收的“标记”阶段,变成了以下 3 个阶段:

  1. 初始标记(STW):只标记和 GC Roots 直接关联的对象,执行速度很快。
  2. 并发标记(和用户线程并发执行):GC Roots 直接关联的对象继续往下(一直)遍历和标记,耗时会比较长。
  3. 重新标记(STW):对上一步“并发标记”阶段因为用户线程执行,而导致变动的对象进行修正标记。

具体执行流程如下:



在整个标记的过程中,只有初始标记和重新标记需要 STW,但是初始标记只标记和 GC Roots 直接关联的对象,而重新标记只是对“并发标记”阶段的用户线程进行修正标记,因此这两个阶段执行的时间都很短,所以整个 STW 停顿时间也就很短。

并且为了让 CMS 能够拥有更短的停顿时间,所以在“标记”阶段完成之后,CMS 采用的是并发清除策略,也就是 GC 垃圾回收线程和用户线程一起执行,这样就不需要 STW 了,所以执行效率就更高了。

CMS 完整执行流程如下:

  1. 初始标记(STW):只标记和 GC Roots 直接关联的对象,执行速度很快。
  2. 并发标记(和用户线程并发执行):GC Roots 直接关联的对象继续往下(一直)遍历和标记,耗时会比较长。
  3. 重新标记(STW):对上一步“并发标记”阶段因为用户线程执行,而导致变动的对象进行修正标记。
  4. 并发清除(和用户线程并发执行):使用并发-清除算法将垃圾对象进行清除。

执行流程如下图所示:

课后思考

虽然 CMS 能实现最短停顿时间,但它也存在一些缺点,例如:会内存碎片的问题。那为什么它会有内存碎片的问题?又怎么能解决内存碎片的问题?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

京东面试:说说CMS工作原理?的更多相关文章

  1. JVM工作原理和特点(一些二逼的逼神面试官会问的问题)

    作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...

  2. 面试:Handler 的工作原理是怎样的?

    面试场景 平时开发用到其他线程吗?都是如何处理的? 基本都用 RxJava 的线程调度切换,嗯对,就是那个 observeOn 和 subscribeOn 可以直接处理,比如网络操作,RxJava 提 ...

  3. 面试官:你分析过mybatis工作原理吗?

    Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...

  4. php面试专题---21、MVC框架基本工作原理考察点

    php面试专题---21.MVC框架基本工作原理考察点 一.总结 一句话总结: 会的东西快速过,不要浪费时间,生命有限,都是一些很简单的东西. 1.mvc框架单一入口的 优势 是什么? 可以进行统一的 ...

  5. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  6. 笔面试复习(spring常用.jar包/事务/控制反转/bean对象管理和创建/springMVC工作原理/sql查询)

    ###spring常用jar包1.spring.jar是包含有完整发布模块的单个jar包.2.org.springframework.aop包含在应用中使用Spring的AOP特性时所需要的类.3.o ...

  7. PHP面试系列 之框架(一)---- MVC框架基本工作原理

    题:谈谈你对MVC的认识,介绍集中目前比较流行的MVC框架 考点: (1)MVC工作原理 (2)常见MVC框架 延伸: (1)单一入口的工作原理 (2)模板引擎的理解 (1)MVC工作原理 Model ...

  8. 面试系列22 dubbo的工作原理

    (1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...

  9. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  10. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

随机推荐

  1. gradle打包命令含离线模式

    gradle打包命令gradlew clean 清理gradlew clean build -x test --refresh-dependencies 离线方式: gradlew --offline ...

  2. kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏

    场景:输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内,trans不报错,但通过错误处理步骤捕捉,并记入文件,整个数据管线正常完成直至处理完最后一个输入行. 解决方案:使用步骤[数据检验]进行 ...

  3. Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

    搜索界面使用Flutter自带的SearchDelegate组件实现,通过魔改实现如下效果: 搜素建议 搜索结果,支持刷新和加载更多 IOS中文输入拼音问题 界面预览 拷贝源码 将SearchDele ...

  4. Playbook条件语句

    目录 Playbook条件语句 1. when的基本使用 1.1 when的基本示例 1.2比较运算符 1.3 比较运算符示例 1.4 逻辑运算符 1.5 逻辑运算符示例 2. 条件判断与block ...

  5. 深度对比!瑞芯微RK3562J比RK3568J好在哪里?

    作为瑞芯微的明星产品--RK3568J,凭借其出色的性能及丰富的外设接口成为国内众多工业客户的最佳选择. 随着RK3568J的大规模应用,很多客户开始针对RK3568J的价格偏高.功耗偏高等问题提出了 ...

  6. 全国产!全志T3+Logos FPGA核心板(4核ARM Cortex-A7)规格书

    核心板简介 创龙科技SOM-TLT3F是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板,ARM C ...

  7. Unity 中关于SubMesh的拾取问题

    问题背景 最近在开发一个功能,钻孔功能,每一层(段)都需要单独拾取,显示不同的颜色,使用不同材质 问题分析 对于这个功能,由于上述需求,很容易想到用submesh实现,但是主要问题是在于对于Subme ...

  8. 使用Stream流实现以List<Map<String, Object>>集合中Map的key值进行排序

    使用Stream流实现以List<Map<String, Object>>集合中Map的key值进行排序 创建一个list存入数据 List<Map<String, ...

  9. java 类的执行顺序

    java代码 package net.cybclass.sp; public class Test01 { public static void main(String[] args) { new c ...

  10. iOS开发基础102-后台保活方案

    iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间.然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即&qu ...