啊啊啊彭迪彭迪 2022-10-10 19:51 采纳率: 0%
浏览 8

CMS到底能不能避免stop the world??

资料里说目前任何垃圾回收器包括CMS都无法避免stop the world,资料里又说CMS可以做到GC时和其他客户线程并发进行,到底谁是对的?

  • 写回答

1条回答 默认 最新

  • 莪是男神 2022-10-10 21:08
    关注

    上面的两句话不矛盾,我这么给你解释一下吧
    记住一句话,CMS 虽然是并发垃圾收集器不假,但是在不是什么时候都是并行执行垃圾回收的。
    CMS 在初始标记时需要 STW, 但是会尽可能短,而其他步骤则是并行执行的

    CMS 是 JDK 第一个真正意义上的并发垃圾收集器。老年代并发收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。

    从名字中的 Mark Sweep 这两个词可以看出,CMS 收集器是一种 “标记-清除” 算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:

    img

    • 初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;
    • 并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
    • 重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
    • 并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。
    评论

报告相同问题?

问题事件

  • 创建了问题 10月10日

悬赏问题

  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。