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. redis setnx java setIfAbsent的使用

    redis setnx java setIfAbsent的使用如果为空就set值,并返回1如果存在(不为空)不进行操作,并返回0 test:0>set mykey "hello&quo ...

  2. CentOS7学习笔记(七) 磁盘管理

    查看硬盘分区信息 在Linux中使用lsblk命令查看硬盘以及分区信息 [root@192 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda ...

  3. python allure将生成报告和打开报告写到命令文件,并默认使用谷歌打开

    背景: 使用python + pytest +allure,执行测试用例,并生成测试报告: allure报告要从收集的xml.json等文件,生成报告,不能直接点击报告的index.html,打开的报 ...

  4. spring与设计模式之五委派模式

    一.定义 主要突出一个安排,派遣. 这个设计模式非常常见,不需要学习也能自然而然地用上. 从广义的角度出发,一个对象用另外一个对象就是委派. 二.经典实现 略. 三.spring实例代码 https: ...

  5. 记一次win10 python -m http.server 启动后无法访问的经历

    前言 最近需要在win10上使用python创建一个http文件服务(默认端口 8000),结果执行了 python3 -m http.server -b 0.0.0.0 后,发现服务跑起来了,但浏览 ...

  6. VirtualBox中Ubuntu 22.04 Server支持kvm

    kvm简介 KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术. 使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机. K ...

  7. 输入Javac提示不是内部或外部命令

    先去百度搜索"jdk下载"下载最新版jdk,并安装,安装目录不用去更改,直接默认就好,下载完了之后,双击打开安装,jdk安装完成后,会接着安装jre包,(jre和jdk是配对的,不 ...

  8. Display、Visibility 和 Opacity 的区别

    <style> .d1{ display: none; } .d2{ visibility: visible; } .d3{ opacity: 0; } </style> &l ...

  9. Stopwatch 类来测量时间间隔

    使用 Stopwatch 类来测量时间间隔. 以下是一个示例代码,展示如何记录 Excel 导入的用时: ' 创建 Stopwatch 实例 Dim stopwatch As New Stopwatc ...

  10. 学习笔记--Java中fpackage和import

    package和import 关于Java语言中的包机制: 包又称为package,Java中引入package主要是为了方便管理 怎么样定义 Java源程序的第一行编写package语句 packa ...