JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?

在 JVM 中,concurrent mode failure 是垃圾回收器(通常是 CMS,即 Concurrent Mark-Sweep GC)在执行并发垃圾回收时,因老年代空间不足导致的失败。这种失败会迫使 JVM 采用 Stop-The-World(STW) 的方式,执行一次单线程的 Full GC,从而导致性能下降。


1. 什么是 CMS 回收器?

CMS(Concurrent Mark-Sweep) 是一种面向低延迟的垃圾回收器,主要针对老年代。它的目标是尽量减少垃圾回收的停顿时间,因此它以并发的方式与应用线程共同工作。

CMS 的回收过程:

  1. Initial Mark(初始标记,STW):

    • 标记 GC Roots 直接引用的对象。
    • 停顿时间较短。
  2. Concurrent Mark(并发标记):

    • 在应用线程运行的同时,标记从 GC Roots 可达的对象。
  3. Remark(重新标记,STW):

    • 修正并发标记阶段因应用线程的运行而遗漏的标记。
    • 停顿时间较短。
  4. Concurrent Sweep(并发清理):

    • 在应用线程运行的同时,清理不可达的对象,释放内存。

2. concurrent mode failure 的原因

concurrent mode failure 的核心原因是 老年代内存不足,导致 CMS 无法完成垃圾回收。以下是具体场景:

原因 1:回收不及时

  • CMS 的垃圾回收是并发的,但如果垃圾回收速度赶不上对象分配速度,老年代内存可能被快速填满,导致失败。

原因 2:碎片化问题

  • CMS 是一种基于标记-清除的算法,不会进行内存压缩。因此,老年代可能存在大量碎片化的内存空间,导致大对象分配失败,即使总可用内存足够。

原因 3:晋升对象过多

  • 如果新生代的垃圾回收过程中需要将大量存活对象晋升到老年代,而老年代空间不足,则会触发 concurrent mode failure

原因 4:配置不合理

  • CMS 的启动时机(由 -XX:CMSInitiatingOccupancyFraction 控制)过晚,导致老年代几乎填满时才开始回收,难以完成垃圾回收任务。

3. 如何解决 concurrent mode failure?

方法 1:调高 CMS 的启动阈值

  • 通过参数 -XX:CMSInitiatingOccupancyFraction=<N> 配置 CMS 的启动阈值(默认是 68%,即老年代使用 68% 时启动垃圾回收)。
  • 建议将值调低,例如设置为 50,使垃圾回收更早开始。

方法 2:增加老年代大小

  • 通过参数 -Xmx-XX:NewRatio 增加堆内存或调整新生代与老年代的比例,为老年代分配更多空间。

方法 3:启用内存压缩

  • 在 CMS 回收后增加内存压缩阶段,减少碎片化:
    -XX:+UseCMSCompactAtFullCollection
    -XX:CMSFullGCsBeforeCompaction=<N>

第一个参数启用压缩,第二个参数设置多少次 Full GC 后进行压缩。

方法 4:监控和调整应用分配模式

  • 通过监控发现是否有大量短生命周期的对象分配到老年代,可以优化代码逻辑,减少直接分配到老年代的频率。

方法 5:更换垃圾回收器

  • 如果 CMS 无法满足需求,可以尝试 G1 GC,它能够自动进行内存压缩,避免碎片化问题。

4. 总结

concurrent mode failure 是 CMS GC 在垃圾回收期间因老年代空间不足而导致的失败。其根本原因在于老年代的内存不足、碎片化或启动时机不当。

关键点:

  1. 提前启动 CMS 垃圾回收(降低 CMSInitiatingOccupancyFraction)。
  2. 增加老年代内存,缓解内存压力。
  3. 启用内存压缩,解决碎片化问题。
  4. 监控和优化对象分配模式,减少老年代分配的压力。

    通过合理配置和优化代码逻辑,可以有效减少 concurrent mode failure 的发生。

JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?的更多相关文章

  1. JVM垃圾回收时的可触及性

    可触及的 1.从根节点可以触及到这个对象可复活的 1.一旦所有引用被释放,就是可复活状态 2.因为在finalize()中可能复活该对象不可触及的 1.在finalize()后,可能会进入不可触及状态 ...

  2. 深入JVM垃圾回收机制,值得你收藏

    JVM可以说是为了Java开发人员屏蔽了很多复杂性,让Java开发的变的更加简单,让开发人员更加关注业务而不必关心底层技术细节,这些复杂性包括内存管理,垃圾回收,跨平台等,今天我们主要看看JVM的垃圾 ...

  3. java JVM垃圾回收机制

    Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...

  4. JVM垃圾回收机制总结(3) :按代垃圾收集器

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  5. JDK分析工具&JVM垃圾回收(转)

    转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/ ...

  6. jvm - 垃圾回收

    jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...

  7. JVM垃圾回收--年轻代、年老点和持久代

    关键字约定 Young generation –>新生代 Tenured / Old Generation –>老年代 Perm Area –>永久代 年轻代: 所有新生成的对象首先 ...

  8. JVM垃圾回收算法(最全)

    JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...

  9. JVM垃圾回收算法及回收器详解

    引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...

  10. JVM垃圾回收--年轻代、年老点和持久代(转)

      关键字约定 Young generation –>新生代 Tenured / Old Generation –>老年代 Perm Area –>永久代 年轻代: 所有新生成的对象 ...

随机推荐

  1. react时时获取表单数据

    import React, { Component } from "react"; export class TestHanderClick extends Component { ...

  2. Linux/Centos文件授权用户文件夹权限介绍

    一.Linux文件权限介绍 在Linux中,一切皆为文件(目录也是文件),每个文件对用户具有可读(read).可写(write).可执行(excute)权限.目录的执行操作表示是否有权限进入该目录并操 ...

  3. Luogu P11543 Code+#5 我有矩阵,你有吗? 题解 [ 绿 ] [ 扩展域并查集 ]

    我有矩阵,你有吗?:并查集小清新题. 思路 看到这题,我第一个想到的竟然是高斯消元. 首先一行和一列肯定不会操作两次以上,不然一定可以等效为操作 \(0\) 次和操作 \(1\) 次的情况. 于是我们 ...

  4. windows10专业版代码永久激活

    1."Win+R"打开运行对话框,输入命令slmgr.vbs -xpr 可以查看当前系统的激活信息 2. 在电脑图标右键,打开属性,查看自己win10系统版本 3. 在开始菜单右键 ...

  5. 【整活向】把tidb的文档塞给了基于oceanbase的RAG机器人

    最近官方推出了免费试用365天的云数据库,版本也升级到了4.3.支持了向量功能. 官方推出了活动体验AI的动手实战活动, 教程中使用了docker单机版数据库,既然有免费的云数据库,就优先使用云数据库 ...

  6. 运行中的Docker容器获取 .NET项目的Dump文件

    进入容器的 shell docker exec -it 容器名称或 id /bin/bash 使用cd命令进入NETSDK所在文件夹 cd /usr/share/dotnet/shared/Micro ...

  7. CentOS7搭建CDH5.16.2集群 HA高可用(包含Spark2等组件部署)

    CentOS7搭建CDH5.16.2集群 HA高可用   机器准备:(这里HA是对HDFS和YARN的高可用) 主机名 cpu内存 bigdata-master01 8c32G bigdata-mas ...

  8. 批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内]

    想到一个情景.程序实时监测文件夹情况,如果有新文件进入,分析其文件名,然后如果满足预设条件,则做相应操作.比如扫描仪扫描了文件,会将新文件保存进特定文件夹内,可以使用该程序来做处理. 在Windows ...

  9. 【目标检测】二、Fast R-CNN与SVD

    1.流程 (1) 空间金字塔池化(spatial pyramid pooling,SPP) 原理: (2)Fast-RCNN 2.数学概念 这么多个全连接层,必然存在计算的性能问题,让数学家们蠢蠢欲动 ...

  10. 提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的。同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序。

    提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的.同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序. 首先,我们需要了解一下 ...