JVM CMS运行原理

Concurrent Mark Sweep (CMS) 是Java虚拟机 (JVM) 中的一种垃圾收集器,它专门用于老年代 (Old Generation) 的垃圾回收。CMS垃圾收集器的特点在于它能够在垃圾回收的同时尽量减少应用程序的暂停时间,这对于那些对响应时间要求较高的应用来说非常重要。下面详细介绍CMS的工作原理和技术细节。

CMS的基本原理

CMS垃圾收集器的核心思想是在尽可能不影响应用程序运行的前提下进行垃圾回收。它通过在垃圾回收的不同阶段采用不同的策略来实现这一目标。

CMS的工作流程

CMS垃圾收集器的工作流程可以分为四个主要阶段:

  1. 初始标记 (Initial Marking):

    • 描述:这是一个短暂的暂停阶段,用于标记出GC Roots直接可达的对象。
    • 特点:这个阶段需要暂停所有的应用程序线程。
  2. 并发标记 (Concurrent Marking):

    • 描述:这个阶段会从GC Roots开始遍历对象图,标记出所有可达的对象。
    • 特点:这个阶段不需要暂停应用程序线程,可以与应用程序并发执行。
    • 潜在问题:由于应用程序可能继续修改对象引用,因此可能会产生"浮动垃圾"(floating garbage),即在并发标记期间产生的新垃圾。
  3. 重新标记 (Remark):

    • 描述:这个阶段会修正并发标记阶段由于程序运行而产生的标记偏差,确保标记准确无误。
    • 特点:这个阶段也需要暂停应用程序线程,但它通常比初始标记阶段耗时更长。
    • 目的:确保垃圾回收完成后没有遗漏的垃圾对象。
  4. 并发清除 (Concurrent Sweep):

    • 描述:这个阶段会清除标记为不可达的对象,并整理内存空间。
    • 特点:这个阶段不需要暂停应用程序线程,可以与应用程序并发执行。
    • 注意事项:CMS收集器不进行压缩整理,所以可能会导致老年代空间碎片化的问题。

CMS的关键特性

  • 低暂停时间:通过将大部分工作放在并发阶段进行,CMS可以显著减少应用程序的暂停时间。
  • 并发执行:除了初始标记和重新标记阶段,CMS的其他阶段都可以与应用程序并发执行。
  • 不压缩内存:CMS不进行内存压缩,这意味着它可能会导致老年代出现空间碎片。
  • 内存碎片:由于CMS不进行压缩,因此可能会出现内存碎片问题,导致无法分配大对象。
  • 使用-标记-清除算法:CMS使用的是标记-清除算法,而不是标记-压缩算法。

CMS的调优

CMS垃圾收集器有一些特定的调优参数,可以用来调整它的行为:

  • 设置CMS为默认的GC :使用 -XX:+UseConcMarkSweepGC 参数启用CMS。
  • 设置年轻代大小 :年轻代的大小会影响CMS的触发时机,可以使用 -Xmn 参数来设置。
  • 设置CMS的并发级别 :可以使用 -XX:ParallelCMSThreads 参数来设置CMS的并发线程数。
  • 设置CMS的暂停时间目标 :可以使用 -XX:MaxPauseMillis 参数来设置最大暂停时间目标。
  • 设置CMS的启动阈值 :可以使用 -XX:CMSInitiatingOccupancyFraction 参数来设置触发CMS收集的堆内存占用百分比。

总结

CMS垃圾收集器通过并发执行大部分的垃圾回收工作来减少应用程序的暂停时间,这对于需要低延迟的应用场景非常有用。尽管CMS在减少暂停时间方面表现出色,但由于它不进行内存压缩,可能会导致内存碎片化问题。随着Java版本的更新,新的垃圾收集器如G1 (Garbage First) 和ZGC (Z Garbage Collector) 等提供了更好的解决方案,它们既能够减少暂停时间,又能解决内存碎片问题。

相关推荐
paopaokaka_luck11 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280411 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
小郎君65812 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧12 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
考虑考虑12 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔12 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n12 小时前
【JUC】四种内存屏障示例
java·1024程序员节
Shimeri12 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J13 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang13 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节