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

相关文章

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

微信小程序开发必知必会:文件结构和基本配置

一、微信小程序基本文件结构 1.  project.config.json:项目的基本配置文件,包括项目名称、appid、项目目录、页面文件夹等。     {"setting": {"urlCheck": false,"es6": true,"postcss": true,"nodeModulesPath": "D:\\\\node_modules"},"appid": "wxd678e

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手

【zabbix】zabbix客户端配置

1、部署zabbix客户端 #zabbix 5.0 版本采用 golang 语言开发的新版本客户端 agent2 。#zabbix 服务端 zabbix_server 默认使用 10051 端口,客户端 zabbix_agent2 默认使用 10050 端口。systemctl disable --now firewalldsetenforce 0hostnamectl set-host