CMS Full GC流程以及调优配置

news2024/12/23 17:47:08

个人博客

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.coloradmin.cn/o/1700041.html

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

相关文章

Three.js 研究:3、创建一个高科技圆环

打开Alpha混合 修改环形颜色,更改发光的颜色,更改发光的强度为2 更改世界环境灯光

基于集成经验模态分解的心电信号降噪和基于希尔伯特变换的R峰检测(MATLAB R2018)

近年来,心脏病已成为危害人类健康最常见的疾病。为了有效预防心脏疾病的发生,往往需要更加准确地采集与诊断心电信号,以便于更好地反映心脏情况。心电信号作为人体生理信号,对于识别心脏异常和心脏疾病具有重要的参考价值。心电信…

Docker 常用命令大全!!

Docker 常用命令 一、启动类1. 启动 docker2. 关闭 docker3. 重新启动 docker4. docker 设置自启动5. 查看 docker 运行状态6. 查看 docker 版本号等信息7. docker 帮助 二、 镜像类1. 查看镜像2. 搜索镜像3. 拉取镜像4. 运行镜像5. 删除镜像6. 加载镜像7. 保存镜像 三、容器类…

电机转速计算(基于码盘和IO外部中断)

目录 概述 1 硬件介绍 1.1 整体硬件结构 1.2 模块功能介绍 2 测速框架介绍 2.1 测速原理 2.2 软件框架结构 3 使用STM32Cube配置Project 3.1 准备环境 3.2 配置参数 3.3 生成Project 4 功能实现 4.1 电机控制代码 4.2 测试代码 4.3 速度计算 5 测试 5.1 编写测…

0基础认识C语言

为了给0基础一个舒服的学习路径,就有了这个专栏希望带大家一起进步。 话不多说,开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初,在那个时代美国有这么一号人叫做丹尼斯.里奇,他和同事肯.汤普逊…

pyqt 浮动窗口QDockwidget

pyqt 浮动窗口QDockwidget QDockwidget效果代码 QDockwidget QDockWidget 是 PyQt中的一个控件,它提供了一个可以停靠在主窗口边缘或者浮动在屏幕上的窗口小部件(widget)。QDockWidget 允许用户自定义其界面,并提供了灵活的停靠和…

【数据结构】栈和队列超详细解析

最重要的就是不要去看远方模糊的,而要做手边清楚的事。💓💓💓 目录 ✨说在前面 🍋知识点一:栈 • 🌰1.什么是栈? • 🌰2.如何实现栈 • 🌰3.栈的基本操作…

一文教你使用stream流轻松解决java项目数据枚举显示问题

本篇文章主要讲解java枚举、vo实体类通过stream流形式输出枚举参数的方法。 日期:2024年5月26日 作者:任聪聪 本文代码实例附件:https://download.csdn.net/download/hj960511/89361611 实际效果 可以看到在枚举参数的基础上,我们…

56.合并区间

class Solution {public int[][] merge(int[][] intervals) {// 对 intervals 数组按照每个区间的开始位置进行排序Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);int len intervals.length;// 创建结果数组 res,初始化长度为 intervals 的长度int[][] re…

【Text2SQL 经典模型】TypeSQL

论文:TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ⭐⭐⭐ Code: TypeSQL | GitHub 一、论文速读 本论文是在 SQLNet 网络上做的改进,其思路也是先预先构建一个 SQL sketch,然后再填充 slots 从而生成 SQL。 论文发…

Thinkphp5内核宠物领养平台H5源码

源码介绍 Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码 可封装APP,适合做猫狗宠物类的发信息发布,当然懂的修改一下,做其他信息发布也是可以的。 源码预览 源码下载 https://download.csdn.net/download/huayula/89361685

什么是云渗透测试?

推荐阅读: 什么是安全态势? 什么是人肉搜索 什么是恶意软件? 什么是数字取证? 什么是语音网络钓鱼? 什么是网络安全中的社会工程? 什么是网络安全中的威胁情报? 什么是端点检测和响应 (…

面试中算法(A星寻路算法)

一、问题需求: 迷宫寻路游戏中,有一些小怪物要攻击主角,现在希望你给这些小怪物加上聪 明的AI (Artificial Intelligence,人工智能),让它们可以自动绕过迷宫中的障碍物,寻找到主角的所在。 A星…

flink程序本地运行:No ExecutorFactory found to execute the application

1.问题描述 在idea中运行flink job程序出现如下错误: Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application. at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getE…

Linux基础 (十):Linux 信号的使用

目录 一、信号的基本概念 二、信号处理常见方式概览 三、修改信号的响应方式 – signal() 3.1 简单复习结束前台进程 3.2 改变SIGINT信号的响应方式 3.3 自定义方式改变进程对信号的响应 3.4 进程对信号作出两种响应 四、发送信号 – kill() 五、利用信号解决僵死进程…

Apache CXF Aegis databinding SSRF 高危漏洞修复

一、漏洞修复 Apache CXF Aegis databinding SSRF漏洞 Spring Web UriComponentsBuilder URL解析不当漏洞 二、修复步骤 1、Apache CXF Aegis databinding SSRF漏洞修复 步骤: 进入服务器搜索 databinding find -name *databinding* 发现版本是3.1.6 果断…

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求,用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务,我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…

list的模拟实现(一)

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(一),下面让我们开始今天的学习吧! list的模拟实现(一) 1.list splice接口的使用 2.list尾插的实现 3.list的迭代…

瑞昱半导体AMB82 MINI(RTL8735B)Arduino 方法介绍

介绍瑞昱半导体(Realtek )AMB82-Mini 物联网 AI开发板 Ameba是一个易于编程的平台,用于开发各种物联网应用程序。AMB82 MINI配备了各种外设接口,包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通过这些接口,AM…

Reids高频面试题汇总总结

一、Redis基础 Redis是什么? Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令来操作这些数据结构。Redis的主要特点是什么? 高性能:Redis将数据存储在内…