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

news/2024/11/17 10:38:47/文章来源:https://www.cnblogs.com/vipstone/p/18351027

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、设计模式、消息队列等模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780362.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

处理idea中的properties中文乱码问题

如果遇到项目使用了prioperties格式的文件,别人拉取代码乱码,可以进行如下操作 另外的idea中 需要注意的是,请在编辑之前就进行设置

我愿称之为全网最通透的layernorm讲解(往下翻)

在我们平常面试和工程中会用到BN和LN,但或许没有去了解过BN和LN到底在那个维度上进行的正则化(减均值除以标准差)。下面将会采用各种例子来为大家介绍BN层和LN层各个参数以及差别。一、BatchNorm(批标准化):BatchNorm一共有三个函数分别是BatchNorm1d,BatchNorm2d,BatchN…

远程桌面授权服务远程代码执行漏洞(CVE-2024-38077)漏洞预警

影响范围 开启了RDL服务的Windows Server 2000到2025都会受到影响 满足以上条件可以直接RCE 关于RDL 服务名全称,Remote Desktop Licensing,如图:这个就是RDL服务,一般运维应该不会刻意去安装这个的,常用自带默认的远程桌面服务加个白名单就够了:解决办法 1、没装RDL服务…

boot sharing

1.BootRom 计算机系统启动过程的第一步,负责进行硬件初始化和加载Boot Loader到RAM等基本操作 根据不同的启动模式(硬件拨码)去不同的存储设备取bootlaoder(决定指令从哪来 bootrom: rom:掉电不易失存储器,通常为nor flash,可以芯片内执行 boot:存储在上述介质中的一小段…

Flowable自动审核、相邻节点审核、已存在审核人审核

Flowable 监听器的使用 需求背景: 1、发起人发起流程,可以实现发起人自动审核 2、上一节点的审核人,与当前节点审核人相同时,自动审核 3、整个流程实例中,存在已审核的审核人,当前节点自动审核 流程图如下所示:针对于自动审核设置,其实是由前端内置bpnm.xml 去设置的,…

ALLEGRO软件打开提示说没有内存

打开云雾管理器,确认下是不是没有内存,如果是内存没问题就重启下电脑

大数据框架之一——Hadoop学习第四天

1、MapReduce序列化(接着昨天的知识继续学习)序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 当两个进程在进行远…

div-固定在页面中间,不被其他元素覆盖

最开始设置的子元素D 是text-align:center,子元素C的内容过长的时候,会发现子元素D不在页面正中了 所以需要把子元素D设置成固定中间,把子元素D设置成固定中间后,发现元素B把子元素D给覆盖了一部分, 所以需要在父元素A和元素B之间加一个空的div,给div设置高度后,父元素A…

div-实现靠左和靠右

display:block; display:inline-table;<div style="margin-bottom: 8px;display:block;"><div style="float:left;color:#ABABAB;font-size:12px;">实际工时</div><div style="float:right;font-size:12px;">{{ item.ac…

pyinstaller 打包uvicorn的坑

0.1 你使用fastapi搭建服务,并使用uvicorn来启动。 0.2 你使用pyinstaller打包成exe文件,并且需要隐藏控制台窗口。 0.3 执行exe文件时,程序报错了(模块相关错误和日志相关错误),网上找的资料都无法解决你的问题。 如果满足这些条件,可以继续往下看,我的方法主要参考ch…