CMS Full GC流程以及调优配置

个人博客

CMS Full GC流程以及调优配置 | iwts’s blog

CMS

CMS 收集器是以实现最短 STW 时间为目标的收集器,所以对于偏业务的后台开发而言,基本上都无脑选CMS了。

多线程收集器,工作在老年代,采用标记清除算法。比较特殊,其他两个老年代收集器都是标记整理。

标记清除算法流程

  1. 初始标记(STW)。

    a. 仅标记 GC Roots 能关联的对象,速度很快。

  2. 并发标记。

    a. GC Roots Tracing。

    b. 此时用户线程是在工作的。

  3. 重新标记(STW)。

    a. 修正并发标记期间因用户线程继续运行而导致标记产生变动的那一部分对象的标记记录。

    b. STW时间稍长。

  4. 并发清除。

    a. 此时用户线程在工作。

总体上看,可以认为 CMS 收集器的内存回收过程是与用户线程一起并发执行的。

在老年代达到80%时进行Full GC,默认6次Minor GC晋升到老年代。

CMS的缺点以及对应配置调优

吞吐量低下问题

CMS 收集器对 CPU 资源非常敏感,因为需要分出回收线程,导致吞吐量下降。

CMS 默认启动的回收线程数是:
回收线程数 = C P U 数量 + 3 4 回收线程数=\frac{CPU数量+3}{4} 回收线程数=4CPU数量+3

所以如果 CPU 数量只有一两个,那吞吐量就直接下降 50%+。

解决方案

没有什么解决方案,一般现在都是4/8 cores+的pod吧,理论上不太可能出现这个问题。顶不住就加机器配置,简单粗暴好用。

浮动垃圾导致的连续Full GC

CMS并发清理阶段多个用户线程在并行运行,所以在清理的同时工作线程也会持续产生新的垃圾。

这个垃圾就是所谓的浮动垃圾(Floating Garbage),只能在下一次 GC 时再清理掉。

取决于 CMS 的算法,这个问题是无法处理,所以可能出现 Concurrent Mode Failure 从而而导致另一次 Full GC 的产生。

解决方案

受限于 CMS 的算法,这个问题是无法解决的,只能避免。

并发处理时,用户线程也要继续运行,需要预留足够多的空间要确保用户线程正常执行,所以 CMS 不能等老年代满了再执行。

所以一个重要的预防点:老年代空间占用多少时触发CMS?这个比例很重要。

比例可以通过-XX:CMSInitiatingOccupancyFraction来设置。

至于比例到底怎么设,这跟具体业务有关,没有完美答案。一般来说只能是碰到问题,然后进行调整,每个业务都有适合自己的比例

比例太高时的现象

设置太高,可能会导致在 CMS 运行期间预留的内存无法满足程序要求,并发执行阶段失败,出现Concurrent Mode Failure。

这时会启用 Serial Old 收集器来重新进行老年代的收集,作为备份。

Serial Old 收集器是单线程收集器,会导致 STW 变的非常长。

比例太低时的现象

设置太低,频繁GC

内存碎片整理导致Full GC时间过长

CMS 采用的是标记清除法,会产生大量的内存碎片,整体内存空间利用率太低,大内存对象分配时可能会经常触发 Full GC。

所以CMS会在Full GC时做内存碎片的合并整理,通过设置-XX:+UseCMSCompactAtFullCollection开启(默认是开启的)。

那么就带来了另一个问题:内存整理会花费时间,从而导致STW时间会变长。导致Full GC时间过长。

解决方案

设置参数-XX:CMSFullGCsBeforeCompation,设置执行多少次不压缩的 Full GC 后执行一次带压缩的Full GC。

从而保证只会偶尔出现一次长时间Full GC。

至于参数怎么设置,依旧与你的服务有关,没有固定答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React开发必须掌握这些es6语法-03

箭头函数 其实就是java的lamda编程,它的特点是单向无环流,没有变量,源数据状态不能被改变。 基本语法 ()> {} //表示一个空函数,和function(){}功能一样,如果只有一行语句则,{}可省略 lef fn arg &g…

【QNX】Qnx IPC通信 Message-passing

Qnx IPC通信 Message-passing Message-passing介绍 QNX提供了多种IPC(Interprocess Communication )通信方式,包括Message-passing、Plus(脉冲)、Event、Signal、共享内存、Pipe,当然还有socket。 Message-passing是Qnx IPC的主…

机器学习 - 特征预处理 - 分箱

分箱(Binning)是一种数据预处理技术,将连续变量分割成离散的组别或区间,有助于减少数据的噪音,提高模型的稳定性。以下是五种常见的分箱方法及其详细介绍: 1. 卡方分箱(Chi-square Binning&…

【数据结构与算法 经典例题】判断链表是否带环

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:数据结构与算法刷题系列(C语言) 期待您的关注 目录

渗透测试框架之CobaltStrike,Metasploit域名上线隐藏IP

概述 为什么要隐藏IP 在拿下了目标机之后,目标机在内网里面,使用msf或者CS时,用自己的VPS做服务器的话,导致很容易被溯源。 域名上线原理 当我们访问域名时会经过域名解析 域名解析就是域名到IP地址的转换过程,那么…

头歌传送指令第1关:传送指令 mov

编程要求 根据下方的所给的汇编代码,在右侧编辑器的代码文件的 Begin - End 区域内补充 C 语言代码。 mov %esp,%ebpand $0xfffffff0,%espsub $0x20,%espmovl $0xa,0x18(%esp)mov 0x18(%esp),%eaxmov %eax,0x1c(%esp)mov 0x1c(%esp),%eaxmov %eax,0x8(%esp)mov 0x18…

dubbo复习:(9)配置中心的大坑,并不能像spring cloud那样直接从配置中心读取自定义的配置

配置中心只是为 Dubbo 配置提供管理使用的(比如配置服务超时时间等)。不要尝试通过Value类似的方式从dubbo 配置中心(比如nacos、zookeeper、Apollo)来获取数据 https://github.com/apache/dubbo/issues/11200可以在application.yml中主要写注册中心的配置&#xf…

【深度学习基础】NumPy数组库的使用

目录 写在开头 一、数组的类型与维度 数组的类型 数组的维度 二、数组的创建 递增数组 同值数组 随机数数组 三、数组的索引 访问/修改单个元素 花式索引 数组的切片 四、数组的变形 数组的转置 数组的翻转 数组的形状改变 数组的拼接 五、数组的运算 数…

Linux系统启动原理

Linux系统启动原理及故障排除 Centos6系统启动过程 修改系统启动级别 vim /etc/inittabCentos7启动流程 加载BIOS信息,进行硬件检测 根据BIOS设定读取设备中的MBR,加载Boot loader 加载内核,内核初始化以后以模块的形式动态加载硬件 并且加…

FFmpeg的流程

文章目录 前序代码结构FFmpeg.cffmpeg_opt.c 小结 前序 之前看过FFmpeg的各种命令,然后不是很理解。相信很多人都不是很理解,毕竟,单纯的去记住那些命令行本身就需要很大的内存,我们的大脑内存又有限,所以&#xff0c…

java “错误:编码GBK 的不可映射字符”

环境:JDK-17 本机编码:utf-8 代码编码:GBK 错误:java “错误:编码GBK 的不可映射字符” 解决1:记事本打开java源文件,另存为选择ANSI编码 解决2:复制代码再将编码格式改为utf-8,…

内网环境基础

什么是内网渗透? 在得到webshell后下一步渗透就是内网渗透 内网渗透就是拿到企业或者公司的内网权限,然后从内网得到最有价值的战果。 内网渗透和外网渗透有啥区别? 内网渗透:比如公司内部局域网 或者酒店内部局域网等。从内部寻找安全问题 外网渗…

错题本之<数据结构>

已知指针 p 指向单向不循环链表中的某一个节点,且不知道头结点。 问:如何删除 p 指向的节点? 答: 如果 p 指向的不是最后一个节点 定义一个指针 q 保存 p->next; 然后将 q 的数据域和指针域都覆盖到 p 指向的节点中 最后释放 …

java欢迪迈手机商城设计与实现源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的欢迪迈手机商城设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 欢迪迈手机商城…

[emailprotected](10)HOC高阶组件和横切关注点

目录 1,什么是HOC2,什么是横切关注点2.1,简单理解2.2,常见解决方式 3,HOC 举例3.1,全局功能3.2,小范围使用 4,HOC 使用注意点4.1,不要在 render 中使用4.2,不…

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,是一种概念性机器,它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。状态…

不同网段的通信过程

这里的AA和HH指的是mac地址,上面画的是路由器 底下的这个pc1,或者其他的连接在这里的pc,他们的默认网关就是路由器的这个192.168.1.1/24这个接口 来看看通信的过程 1、先判断(和之前一样) 2、去查默认网关&#xf…

基于SpringBoot和Hutool工具包实现的验证码案例

目录 验证码案例 1. 需求 2. 准备工作 3. 约定前后端交互接口 需求分析 接口定义 4. Hutool 工具介绍 5. 实现验证码 后端代码 前端代码 6. 运行测试 验证码案例 随着安全性的要求越来越高,目前项目中很多都会使用验证码,只要涉及到登录&…

MySQL Mysqldump备份时的错误提示

MySQL Mysqldump备份时的错误提示 执行mysqldump备份数据库时,命令如下: mysqldump -h8.137.112.148 -udbusername -pdbpassword dbname > /opt/backup_mysql/bkdata/$(date "%Y%m%d%H%M%S")出现以下错误: mysqldump: Could…