当前位置: 首页 > news >正文

一文读懂fgc之cms

一文读懂 fgc之cms-实战篇

1. 前言

线上应用运行过程中可能会出现内存使用率较高,甚至达到95+仍然不触发fgc的情况,存在内存打满风险,持续触发fgc回收;或者内存占用率较低时触发了fgc,导致某些接口tp99,tp999上升,触发下游系统以及自身系统频繁告警。

2. java8场景下为什么要使用cms

在Java 8场景下,使用CMS(Concurrent Mark Sweep)收集器的原因主要基于以下几点:

2.1 CMS收集器的设计特性

并发垃圾收集:CMS收集器使用并发线程跟踪可达对象,以减少Major GC(即老年代垃圾收集)带来的暂停时间。它允许应用程序线程和垃圾收集线程在Major GC期间并发运行,从而降低了应用程序的停顿时间。

分代收集:CMS收集器也是基于“代”的收集器,支持Minor GC和Major GC。Minor GC可以与正在进行的Major GC交叉进行,提高了垃圾收集的效率。

两次主要停顿:CMS收集器在GC过程中会有两次短暂的停顿:初始化标记(initial mark pause)和再标记(remark pause)。初始化标记停顿较短,用于标记从GC root能直接访问到的对象;再标记停顿稍长,用于处理并发跟踪阶段中程序线程引用发生变化的对象。

浮动垃圾:由于并发GC期间对象状态可能发生变化,因此会产生浮动垃圾(Floating Garbage)。浮动垃圾的数量取决于并发收集周期的持续时间和应用程序引用更新的频率。可以通过增大老年代空间来缓解浮动垃圾带来的问题。

2.2 CMS收集器的适用场景

需要短暂停顿时间的应用:CMS收集器非常适合那些需要低停顿时间的应用程序,如大型数据应用和多处理器环境下的应用。在这些环境中,CMS收集器能够充分利用多处理器的优势,通过并发执行垃圾收集来降低应用程序的停顿时间。

偏好更短GC暂停时间的应用:对于那些能够忍受GC分享处理器资源,但希望有更短GC暂停时间的应用来说,CMS收集器是一个很好的选择。

2.3 注意事项

并发模式失败:如果CMS收集器无法在老年代满之前完成垃圾收集,或者老年代的可用空间无法满足某次分配操作,那么会发生并发模式失败(Concurrent Mode Failure),导致应用程序线程暂停并完成GC。
此时,可以通过调整CMS收集器的参数来避免并发模式失败。

3. cms触发的时机

这里我们仅介绍配置CMSInitiatingOccupancyFraction参数的场景(一般都会改这个参数的默认值):如果大于阈值(默认92%,阈值参数为CMSInitiatingOccupancyFraction),则进行CMS GC。
那么这里说的阈值是什么呢?指的是老年代被使用的内存空间的阈值。

一定注意,这里说的是老年代被使用的内存空间,我们通过jvm监控一般看到的都是整个堆内存的占比,所以通过这个监控看到的fgc数据可能与CMSInitiatingOccupancyFraction设定不一致。这里我们可以结合精细化的监控来分析。

举个例子,在8C16G的机器上,假设堆内存为10000M,新生代为5000M,元空间为500M(元空间使用本地内存(即操作系统的内存),而不是堆内存,因此它的大小不再受限于JVM的堆内存设置。元空间主要用于存放类的元数据信息,包括类的名称、成员变量、方法等信息)。那么老年代大概就是5000M,如果设置了-XX:CMSInitiatingOccupancyFraction=75。结合上文,触发fgc的一种场景就是老年代占用达到3750M左右。

4. 如何根据运行情况调整fgc触发的时机

这里我们仅介绍CMSInitiatingOccupancyFraction作用的场景。如果我们设定了-XX:CMSInitiatingOccupancyFraction=75,可以观察一段时间线上应用的jvm监控。执行fgc时,如果堆内存整体使用率较低,这时我们可以适当增大CMSInitiatingOccupancyFraction延迟fgc触发的时机再观察调整,比如先增加到80;如果堆内存整体使用率较高,或使用率较高时仍不触发fgc,那么就需要考虑减小CMSInitiatingOccupancyFraction以加快fgc触发的时机,比如先调到70。

5. 一切的理论都要基于实践进行验证

大部分开发者可能在部署时很少关注jvm参数,或者关注的较少,大都其他地复制直接使用。但是线上运行场景繁杂,统一的参数并不能满足所有的场景。这时我们就需要结合实际的监控 + 理论来不断的调整,直到应用达到最佳运行状态。比如调整增大堆内存以延缓gc,增大新生代以减少ygc从而提高tp999,调整CMSInitiatingOccupancyFraction适配。
我负责有个toC的大流量应用,在过年期间出现流量升高,tp999上升,部分扩容后只是短暂缓解了问题,考虑随意扩容可能造成机器过度浪费,于是先降低限流值保障稳定的同时寻求其他方案。观察tp999上升的机器,可以发现jvm监控数据都出现了多次的ygc,于是考虑用一个分组来实验,调整新生代大小来降低ygc的频率。实验运行一段时后果然tp999稳定了很多,于是逐步灰度到全量的机器,保障了线上接口的稳定性。

相关文章:

一文读懂fgc之cms

一文读懂 fgc之cms-实战篇 1. 前言 线上应用运行过程中可能会出现内存使用率较高,甚至达到95仍然不触发fgc的情况,存在内存打满风险,持续触发fgc回收;或者内存占用率较低时触发了fgc,导致某些接口tp99,tp…...

Agent 高频知识汇总:查漏补缺参考大全

Agent 高频问题汇总 一、基础概念类 (一)请解释 Agent 的概念及其主要特点 Agent 是一种能够感知所处环境,并基于感知信息做出决策、采取行动以实现特定目标的实体。它既可以是简单的规则基系统,也能是复杂的智能体&#xff0c…...

毕业设计--具有车流量检测功能的智能交通灯设计

摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…...

fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory

一、环境 1. Visual Studio 2017 2. edk2:202305 3. Python:3.11.4 二、 fatal error C1083: ޷򿪰ļ: openssl/opensslv.h: No such file or directory 上图出现这个警告,不用管。 出现Done,说明编译成功。 执行上…...

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…...

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接:Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要: 拷贝数变异(CNV)约占人类基因组的12%。除了CNVs在癌症发展中的…...

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似,都是绕开new的,但是有些许不同。 动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 假设案例 假设…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)

目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体? 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…...

负荷预测算法模型

1. 时间序列分析方法 时间序列分析方法是最早被用来进行电力负荷预测的方法之一,它基于历史数据来构建数学模型,以描述时间与负荷值之间的关系。这种方法通常只考虑时间变量,不需要大量的输入数据,因此计算速度快。然而&#xff…...

Flutter Candies 一桶天下

| | | | | | | | 入魔的冬瓜 最近刚入桶的兄弟,有责任心的开发者,对自己的项目会不断进行优化,达到最完美的状态 自定义日历组件 主要功能 支持公历,农历,节气,传统节日,常用节假日 …...

android Camera 的进化

引言 Android 的camera 发展经历了3个阶段 : camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时,会…...

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统,重复开发,维护多套版本 多种语言栈,对人员技能要求高 多种开发框架,不同的编程…...

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...

C++并发:设计基于锁的并发数据结构

(上一篇主要讲了底层逻辑,比较晦涩难懂,这一章讲解数据结构设计) 对于并发场景,数据保护的形式主要如下: 1 采用独立互斥和外部锁 2 专门为并发访问自行设计的数据结构 1 并发设计的内涵 互斥保护数据结…...

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…...

leetcode 844 比较含退格的字符串

leetcode 844 比较含退格的字符串 题目描述 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1&#…...

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…...

10.6 LangChain提示工程终极指南:从基础模板到动态生成的工业级实践

LangChain提示工程终极指南:从基础模板到动态生成的工业级实践 关键词: LangChain提示模板、动态Prompt生成、少样本学习、结构化输出、Prompt工程 一、Prompt Engineering 的本质:用设计模式重构大模型交互 传统Prompt的局限性: 硬编码文本:修改需求需重构代码缺乏结构…...

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来,人工智能(AI)领域发展迅猛,大语言模型(LLMs)为通用人工智能(AGI)的发展开辟了道路。OpenAI 的 o1 模型表现非凡,它引入的创新性推理时缩放技术显著提升了推理能力…...

联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸

晚上23点10分前下单,第二天上午显示屏送到,检查外包装没拆封过。这个屏幕左下方有几个按键,按一按就开屏幕、按一按就关闭屏幕,按一按方便节省时间,也支持阅读等模式。 显示屏是 :AOC 27英寸 2K高清 100Hz…...

编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)

编译安装 前置需求: 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧,pip编译安装的时候,可以加上--jobs64来多核编译。 注意先升级pip版本:pip install pip -U pip3 install faiss-cpu --config-s…...

传输层协议TCP与UDP:深入解析与对比

传输层协议TCP与UDP:深入解析与对比 目录 传输层协议TCP与UDP:深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…...

《解码AI大模型涌现能力:从量变到质变的智能跃迁》

在当今科技飞速发展的时代,人工智能大模型的涌现能力成为了众人瞩目的焦点。从ChatGPT与用户的流畅对话,到GPT-4在复杂任务中的出色表现,这些大模型仿佛一夜之间解锁了超乎想象的技能,那么,这种神奇的涌现能力究竟是如…...

【数据结构】_C语言实现带头双向循环链表

目录 1. 单链表与双链表 1.1 单链表的结构及结点属性 1.2 双链表的结构及结点属性 2. 单链表与双链表的区别 3. 双链表的实现 3.1 List.h 3.2 List.c 3.3 Test_List.c 注:部分方法的实现细节注释 1. 双链表结点前驱、后继指针域的初始化 2. 各种增、删结…...

优盘恢复原始容量工具

买到一个优盘,显示32mb,我见过扩容盘,但是这次见到的是缩容盘,把2g的容量缩成32MB了,首次见到。。用芯片查询工具显示如下 ChipsBank(芯邦) CBM2199E 使用以下工具,恢复原始容量。。 其他CMB工具可能不行…...

JVM的GC详解

获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看,具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示,命令格式为jstat -gc…...

反转单向链表以及单链表添加节点、遍历单链表

反转1个单向链表 /*** 节点类*/ class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}Overridepublic String toString() {return "ListNode{" "val" val ", next" next };} }借助一个pre来存储每…...

ZZNUOJ(C/C++)基础练习1021——1030(详解版)

目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 (C语言版,三目运算)C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...

Linux学习笔记——系统维护命令

一、进程管理 1、ps命令(查) 来自process缩写,显示当前的进程状态。包括:进程的号码,发起者,系统资源,使用占比,运行状态等等。 语法格式:ps 参数 实例&#x…...

Harbor 部署

harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮,总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论,所以像相机矩阵推导这种网上已经很多优质文章的内容,笔者就一笔带过。 然而关于负缩放&#xf…...

开源的瓷砖式图像板系统Pinry

简介 什么是 Pinry ? Pinry 是一个开源的瓷砖式图像板系统,旨在帮助用户轻松保存、标记和分享图像、视频和网页。它提供了一种便于快速浏览的格式,适合喜欢整理和分享多种媒体内容的人。 主要特点 图像抓取和在线预览:支持从网页…...

LabVIEW透镜多参数自动检测系统

在现代制造业中,提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统,该系统能够在单一工位上完成透镜的多项质量参数检测,并实现透镜的自动搬运与分选,极大地提升了检…...

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…...

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当…...

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的(如果代码有错漏,可查看源码) 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…...

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍(软件)3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐(硬件)4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…...

解锁维特比算法:探寻复杂系统的最优解密码

引言 在复杂的技术世界中,维特比算法以其独特的魅力和广泛的应用,成为通信、自然语言处理、生物信息学等领域的关键技术。今天,让我们一同深入探索维特比算法的奥秘。 一、维特比算法的诞生背景 维特比算法由安德鲁・维特比在 1967 年提出…...

Unity游戏(Assault空对地打击)开发(2) 基础场景布置

目录 导入插件 文件夹整理 场景布置 山地场景 导入插件 打开【My Assets】(如果你刚进行上篇的操作,该窗口默认已经打开了)。 找到添加的几个插件,点击Download并Import x.x to...。 文件夹整理 我们的目录下多了两个文件夹&a…...

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时,一般不用斜体,取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…...

代码随想录算法训练营第三十九天-动态规划-213. 打家劫舍 II

与上一题基本一样,只不过房间形成一个环,就需要在首尾考虑状况多一些这不是多一些状况的问题,是完全不知道如何选择的问题这种状况详细分析一下就是要分成三种情况 第一种:不考虑首元素,也不考虑尾元素,只考…...

自然语言处理-词嵌入 (Word Embeddings)

词嵌入(Word Embedding)是一种将单词或短语映射到高维向量空间的技术,使其能够以数学方式表示单词之间的关系。词嵌入能够捕捉语义信息,使得相似的词在向量空间中具有相近的表示。 📌 常见词嵌入方法 基于矩阵分解的方…...

Redis 数据备份与恢复

Redis 数据备份与恢复 引言 Redis 是一款高性能的键值对存储系统,广泛应用于缓存、消息队列、分布式锁等领域。为了保证数据的安全性和可靠性,定期对 Redis 数据进行备份与恢复是至关重要的。本文将详细介绍 Redis 数据备份与恢复的方法,帮助您更好地管理和维护 Redis 数据…...

【leetcode】T541 (两点反思)

解题反思 闷着头往,往往会写成一团浆糊,还推倒重来,谋划好全局思路再开始很重要。 熟悉C的工具库很重要,一开始看到反转就还想着用stack来着,后面突然想起来用reverse函数刚好可以用哇,这题也就迎刃而解了…...

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…...

嵌入式系统|DMA和SPI

文章目录 DMA(直接内存访问)DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI(串行外设接口)SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA(直接内存访问) 类型:DMA是一种数据传输接口…...

LevelDB 源码阅读:写入键值的工程实现和优化细节

读、写键值是 KV 数据库中最重要的两个操作,LevelDB 中提供了一个 Put 接口,用于写入键值对。使用方法很简单: leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…...

寒假刷题Day18

一、16. 最接近的三数之和 这一题有负数&#xff0c;没有单调性&#xff0c;不能“大了右指针左移&#xff0c;小了左指针右移&#xff0c;最后存值域求差绝对值”。 class Solution { public:int threeSumClosest(vector<int>& nums, int target) {ranges::sort(n…...

力扣219.存在重复元素每日一题(大年初一)

以一道简单题开启全新的一年 哈希表&#xff1a;我们可以使用 哈希表 来存储数组元素及其对应的索引。通过遍历数组&#xff0c;我们可以检查当前元素是否已经存在于哈希表中&#xff0c;并判断索引差是否满足条件。 具体步骤如下&#xff1a; 创建一个哈希表 map&#xff0c…...

Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能

开篇 Midjourney中有3个图片“微调”&#xff0c;它们分别为&#xff1a; 强变化&#xff1b;弱变化&#xff1b;局部重绘&#xff1b; 在Discord里分别都是用命令唤出的&#xff0c;但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中&#xff0c;我们发觉这样的逆天…...