CMS Full GC流程以及调优配置

2024-05-27 01:12
文章标签 配置 流程 cms gc 调优 full

本文主要是介绍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。

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

这篇关于CMS Full GC流程以及调优配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006107

相关文章

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.