首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析

CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析

热心网友
80
转载
2026-05-07

CMS垃圾收集器详解:初始标记、并发标记、重新标记、并发清除四个阶段中哪些需要Stop The World

CMS 垃圾收集器:详解初始标记、并发标记、重新标记、并发清除四个阶段中哪些需要 Stop The World

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在探讨CMS垃圾收集器时,一个关键问题常常被提出:它究竟在哪些阶段会引发“世界暂停”?明确来说,在其标准工作流程的四个阶段中,仅有初始标记和重新标记这两个环节需要触发Stop The World(STW)。这一设计精准地体现了CMS以“最小化延迟”为核心的设计哲学。

初始标记阶段为何必须STW

初始标记阶段可以视作一次高效的“闪电扫描”。其核心任务非常明确:仅标记那些与GC Roots直接相连的第一层对象。具体包括:

  • 虚拟机栈(局部变量表)中直接引用的对象
  • 本地方法栈中JNI引用的Java对象
  • 方法区中静态属性引用的类对象
  • 方法区中常量池引用的字符串等对象

由于只需进行一层快速扫描,此阶段的停顿时间极短,通常可控制在毫秒级。但为何必须暂停所有用户线程?根本原因在于确保标记基准的准确性——必须冻结应用状态,获取一个瞬间的、一致的“内存根集快照”。若用户线程仍在运行,根对象集合将处于动态变化中,标记工作便失去了可靠的基础。

并发标记阶段为何无需STW

初始标记完成后,CMS即进入最耗时的并发标记阶段。在此阶段,垃圾收集线程将从已标记的根对象出发,递归遍历整个对象引用链,逐步标记出所有存活的、可达的对象。

此过程的核心优势在于与用户线程并发执行。这意味着应用程序可以持续提供服务,不会因垃圾回收而中断。当然,并发标记在避免停顿的同时,也带来了较长的执行时间,并且会与用户线程竞争CPU计算资源,对系统吞吐量有一定影响。

重新标记阶段为何必须STW

由于并发标记阶段用户线程仍在运行,新的问题随之产生:在漫长的标记过程中,用户线程可能创建了新对象或改变了原有引用关系,导致部分对象出现“漏标”(本应存活却未标记)或“误标”(本应回收却被标记)的情况。

重新标记阶段正是为解决此问题而设。它负责进行最终修正,处理在并发标记期间发生变动的对象引用。此阶段必须再次暂停所有用户线程,以确保能基于一个稳定的内存状态完成最终标记。虽然其耗时略长于初始标记,但相比完整的并发标记,仍是一次非常短暂的强制性暂停。

并发清除阶段为何无需STW

当所有标记工作完成后,便进入最后的清理阶段。在并发清除环节,收集器将依据最终的标记结果,直接回收那些被判定为死亡的对象所占用的内存空间。由于CMS采用经典的“标记-清除”算法,无需移动存活对象,因此整个清理过程可以安全地与用户线程并发进行,不会引发全局性停顿。

总结而言,CMS的设计逻辑清晰而高效:将最耗时的标记与清除任务尽可能置于并发阶段完成,仅保留两次不可避免的、极其短暂的轻量级暂停。这正是它被誉为“低延迟收集器”的核心机制。当然,这种设计也带来了内存碎片、并发模式失败等后续问题,需要在具体应用场景中综合权衡。

来源:https://www.php.cn/faq/2423204.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析
编程语言
CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析

CMS垃圾收集器以低延迟为目标,其四个阶段中仅初始标记和重新标记需要暂停所有用户线程。初始标记快速标记直接关联对象,重新标记修正并发标记期间变动的引用,两者停顿时间极短。而并发标记和并发清除阶段则与用户线程并行执行,避免了长时间中断。

热心网友
05.07
Anthropic 确认新 Claude 模型技术信息已披露
AI
Anthropic 确认新 Claude 模型技术信息已披露

几个小时前,Anthropic 因外部 CMS 配置失误,意外泄露了一批尚未公开的新模型相关信息。外媒《Fortune》率先发现并核实,这些内容来自一组本应处于内部管理状态、却被错误暴露在公开可访问

热心网友
03.27
AI Overviews如何设置数据治理 AI Overviews元数据标准
AI
AI Overviews如何设置数据治理 AI Overviews元数据标准

AI Overviews的功能高度依赖于所处理的数据质量和结构。因此,建立有效的数据治理体系和定义清晰的元数据标准是确保AI Overviews输出准确、相关信息的基础。本文旨在探

热心网友
07.22
旅游电商优势分析及对策
手机教程
旅游电商优势分析及对策

尽管电子商务在我国已广泛普及,但整体发展水平仍处于初级阶段,呈现出单向性特征,许多行业和区域尚未实现与电商的深度融合,难以借此推动经济增长。作为涵盖多个细分领域的庞大产业,旅游业早

热心网友
07.06
速览 Sanctum 代币及空投最新信息
web3.0
速览 Sanctum 代币及空投最新信息

北京时间 6 月 5 日,solana 生态lst 质押协议 sanctum 正式公布了关于代币经济模型的基础信息,并通过后续的社区 ama 解释了关于积分活动、空投方案的一些细节

热心网友
06.23

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Java对象比对防空指针指南Objects.equals方法安全使用详解
编程语言
Java对象比对防空指针指南Objects.equals方法安全使用详解

在Java中直接调用a equals(b)进行对象比较时,若a为null会抛出NullPointerException。使用Objects equals(a,b)方法能自动处理参数为null的情况,其内部通过先检查引用是否为null再调用equals,从而安全地完成比较。该方法适用于实体字段判等等场景,但需注意其将两个null视为相等的设计是否符合具体业务逻

热心网友
05.07
Java子线程崩溃全局捕获与处理指南ThreadsetUncaughtExceptionHandler方法详解
编程语言
Java子线程崩溃全局捕获与处理指南ThreadsetUncaughtExceptionHandler方法详解

全局拦截子线程崩溃需设置默认处理器并结合自定义ThreadFactory为每个新线程注入统一处理器,前者作为兜底方案,但无法覆盖已有专属处理器的线程及Android主线程。Android中还需额外处理主线程及异步框架异常。捕获崩溃后应留存现场、异步上报并防止雪崩。

热心网友
05.07
CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析
编程语言
CMS垃圾收集器详解初始标记并发标记重新标记与并发清除阶段分析

CMS垃圾收集器以低延迟为目标,其四个阶段中仅初始标记和重新标记需要暂停所有用户线程。初始标记快速标记直接关联对象,重新标记修正并发标记期间变动的引用,两者停顿时间极短。而并发标记和并发清除阶段则与用户线程并行执行,避免了长时间中断。

热心网友
05.07
Java只读缓冲区创建指南ByteBufferasReadOnlyBuffer方法详解与数据保护实践
编程语言
Java只读缓冲区创建指南ByteBufferasReadOnlyBuffer方法详解与数据保护实践

ByteBuffer asReadOnlyBuffer()方法创建原缓冲区的只读视图,共享底层数据且禁止写入,但无法阻止通过其他可写引用修改数据,因此不提供真正的数据隔离。它适用于需只读访问且避免拷贝的场景;若需完全隔离,则应进行深拷贝。

热心网友
05.07
Java单例模式初始化空指针异常ExceptionInInitializerError排查指南
编程语言
Java单例模式初始化空指针异常ExceptionInInitializerError排查指南

ExceptionInInitializerError常包裹单例模式静态初始化时发生的空指针异常。排查需通过getCause()找到根源,通常是静态字段赋值或静态代码块中的空值。应注意静态初始化顺序,避免循环依赖。对于复杂初始化,推荐使用懒汉式并在getInstance()方法内进行异常处理,以便直接定位问题。

热心网友
05.07