JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?
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 的回收过程:
Initial Mark(初始标记,STW):
- 标记 GC Roots 直接引用的对象。
- 停顿时间较短。
Concurrent Mark(并发标记):
- 在应用线程运行的同时,标记从 GC Roots 可达的对象。
Remark(重新标记,STW):
- 修正并发标记阶段因应用线程的运行而遗漏的标记。
- 停顿时间较短。
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 在垃圾回收期间因老年代空间不足而导致的失败。其根本原因在于老年代的内存不足、碎片化或启动时机不当。
关键点:
- 提前启动 CMS 垃圾回收(降低 CMSInitiatingOccupancyFraction)。
- 增加老年代内存,缓解内存压力。
- 启用内存压缩,解决碎片化问题。
- 监控和优化对象分配模式,减少老年代分配的压力。
通过合理配置和优化代码逻辑,可以有效减少 concurrent mode failure 的发生。
JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?的更多相关文章
- JVM垃圾回收时的可触及性
可触及的 1.从根节点可以触及到这个对象可复活的 1.一旦所有引用被释放,就是可复活状态 2.因为在finalize()中可能复活该对象不可触及的 1.在finalize()后,可能会进入不可触及状态 ...
- 深入JVM垃圾回收机制,值得你收藏
JVM可以说是为了Java开发人员屏蔽了很多复杂性,让Java开发的变的更加简单,让开发人员更加关注业务而不必关心底层技术细节,这些复杂性包括内存管理,垃圾回收,跨平台等,今天我们主要看看JVM的垃圾 ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
- JVM垃圾回收机制总结(3) :按代垃圾收集器
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...
- JDK分析工具&JVM垃圾回收(转)
转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/ ...
- jvm - 垃圾回收
jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...
- JVM垃圾回收--年轻代、年老点和持久代
关键字约定 Young generation –>新生代 Tenured / Old Generation –>老年代 Perm Area –>永久代 年轻代: 所有新生成的对象首先 ...
- JVM垃圾回收算法(最全)
JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...
- JVM垃圾回收算法及回收器详解
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...
- JVM垃圾回收--年轻代、年老点和持久代(转)
关键字约定 Young generation –>新生代 Tenured / Old Generation –>老年代 Perm Area –>永久代 年轻代: 所有新生成的对象 ...
随机推荐
- react时时获取表单数据
import React, { Component } from "react"; export class TestHanderClick extends Component { ...
- Linux/Centos文件授权用户文件夹权限介绍
一.Linux文件权限介绍 在Linux中,一切皆为文件(目录也是文件),每个文件对用户具有可读(read).可写(write).可执行(excute)权限.目录的执行操作表示是否有权限进入该目录并操 ...
- Luogu P11543 Code+#5 我有矩阵,你有吗? 题解 [ 绿 ] [ 扩展域并查集 ]
我有矩阵,你有吗?:并查集小清新题. 思路 看到这题,我第一个想到的竟然是高斯消元. 首先一行和一列肯定不会操作两次以上,不然一定可以等效为操作 \(0\) 次和操作 \(1\) 次的情况. 于是我们 ...
- windows10专业版代码永久激活
1."Win+R"打开运行对话框,输入命令slmgr.vbs -xpr 可以查看当前系统的激活信息 2. 在电脑图标右键,打开属性,查看自己win10系统版本 3. 在开始菜单右键 ...
- 【整活向】把tidb的文档塞给了基于oceanbase的RAG机器人
最近官方推出了免费试用365天的云数据库,版本也升级到了4.3.支持了向量功能. 官方推出了活动体验AI的动手实战活动, 教程中使用了docker单机版数据库,既然有免费的云数据库,就优先使用云数据库 ...
- 运行中的Docker容器获取 .NET项目的Dump文件
进入容器的 shell docker exec -it 容器名称或 id /bin/bash 使用cd命令进入NETSDK所在文件夹 cd /usr/share/dotnet/shared/Micro ...
- CentOS7搭建CDH5.16.2集群 HA高可用(包含Spark2等组件部署)
CentOS7搭建CDH5.16.2集群 HA高可用 机器准备:(这里HA是对HDFS和YARN的高可用) 主机名 cpu内存 bigdata-master01 8c32G bigdata-mas ...
- 批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内]
想到一个情景.程序实时监测文件夹情况,如果有新文件进入,分析其文件名,然后如果满足预设条件,则做相应操作.比如扫描仪扫描了文件,会将新文件保存进特定文件夹内,可以使用该程序来做处理. 在Windows ...
- 【目标检测】二、Fast R-CNN与SVD
1.流程 (1) 空间金字塔池化(spatial pyramid pooling,SPP) 原理: (2)Fast-RCNN 2.数学概念 这么多个全连接层,必然存在计算的性能问题,让数学家们蠢蠢欲动 ...
- 提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的。同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序。
提供一个纯C语言的图像压缩程序,但是要达到将6MB的图片压缩到100KB以内的要求,有损压缩肯定是必须的.同时,要在速度上有所提升,我可以为您提供一个基于多线程的图像压缩程序. 首先,我们需要了解一下 ...