首页 > 其他分享 >京东面试:说说CMS工作原理?

京东面试:说说CMS工作原理?

时间:2024-08-09 16:51:46浏览次数:15  
标签:并发 停顿 标记 面试 STW 线程 京东 CMS

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):对上一步“并发标记”阶段因为用户线程执行,而导致变动的对象进行修正标记。

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

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

CMS 完整执行流程如下:

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

执行流程如下图所示:
image.png

课后思考

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

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

标签:并发,停顿,标记,面试,STW,线程,京东,CMS
From: https://www.cnblogs.com/vipstone/p/18351027

相关文章

  • 关于最近面试的一些心得
    回来了一段时间,在某招聘App上陆续有一些人主动找上门,但是基本都是毫无针对性的询问对岗位是否有意向。也陆续投了一些公司的,但是基本都是石沉大海。一些人跟我说现在大环境不好,招聘的岗位少。这种思维我不敢苟同,只能说很多企业自身经营都成问题,只是借大环境不好来掩盖真实的问......
  • 前端面试手撕算法大全
    写在前面文末有我在前端面试多年的经验文章,分享给大家!!!防抖//防抖:n秒后在执行该事件,若在n秒内被重复触发,则重新计时//防抖(debounce)函数是指在一定时间内,事件被触发多次,只执行最后一次。这在处理诸如输入框实时搜索等场景时非常有用,避免了频繁触发事件导致性能问题......
  • 11.面试题——消息队列RabbitMQ
    1.RabbitMQ是什么?特点是什么?RabbitMQ是一种开源的消息队列中间件,用于在应用程序之间进行可靠的消息传递。它实现了AMQP(AdvancedMessageQueuingProtocol)协议,提供了强大的消息处理能力。RabbitMQ的主要特点包括:可靠性:RabbitMQ使用可靠的消息传递机制,确保消息能够安全地传......
  • 【面试高频,必知必会】OpenGL渲染流程
    ......
  • Python面试宝典第30题:找出第K大元素
    题目        给定一个整数数组nums,请找出数组中第K大的数,保证答案存在。其中,1<=K<=nums数组长度。        示例1:输入:nums=[3,2,1,5,6,4],K=2输出:5        示例2:输入:nums=[50,23,66,18,72],K=3输出:50快速选择算法......
  • Java后端面试题(redis相关1)(day7)
    目录为什么要用Redis?Redis到底是多线程还是单线程?Redis数据持久化机制RDB方式AOF方式Redis是单线程,但为什么快?Redis过期删除策略Redis内存淘汰策略为什么要用Redis?基于内存操作,内存读写速度快支持多种数据类型,包括String、Hash、List、Set、ZSet等支持持久化,Redi......
  • 【面试】解释概率和似然的区别
    面试模拟场景面试官:你能解释一下概率和似然的区别吗?参考回答示例概率(Probability)概念:概率是指在给定模型参数和已知条件下,观察到某个数据样本的可能性。换句话说,概率描述的是在已知模型和参数的情况下,某个事件发生的可能性。公式:......
  • 「Android面试」Android 子线程为什么直接更新UI?
    本文将从子线程不能更新UI的直接原因、根本原因、Android如何做到限制以及子线程该如何正确更新UI四个方向回答问题。【直接原因】在子线程中更新UI会怎样?程序会出现以下错误:Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews. 【根本原因......
  • 面试官:说说MySQL调优?
    MySQL作为关系型数据库的典型代表,其流行程度超越于任何数据库,因此在Java面试中,MySQL是一定会被问到的重要知识点。而在MySQL中有一道极其常见的面试题,我们这里系统的来看一下,这就是我们今天要讨论的MySQL调优问题。MySQL调优的大体思路如下:具体调优思路如下。1.查询......
  • 后台开发必问题:分库分表面试题及参考答案(3万字长文)
    目录简述为什么要分库?简述为什么要分表?解释什么时候考虑分库分表?简述什么是数据库垂直切分?简述什么是数据库水平切分?请简述数据库分库分表的概念及其优缺点。数据库垂直分表和水平分表的主要区别是什么?什么是数据库分片?它有哪些常见的实现方式?如何分库分表?分库分表......