JVM生产环境调优实战
案例三:JVM频繁Full GC优化
1. 项目背景(Situation)
在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000,采用微服务架构,核心服务基于Java开发,运行在容器集群上。随着业务量增长,系统在运行数小时后频繁触发Full GC,导致服务响应时间(RT)从平均50ms飙升至2秒以上,严重影响了实时风控决策的时效性。
2. 问题与挑战(Task)
- 现象:
- 老年代内存占用持续增长,每小时触发3-4次Full GC,每次停顿时间超过3秒。
- 系统吞吐量下降30%,部分交易因超时被风控系统误判为高风险。
- 目标:
- 在1周内定位内存泄漏根源并优化,将Full GC频率降至每天1次以内,停顿时间控制在200ms以下。
- 保障系统在业务高峰期稳定运行,避免因GC停顿导致交易积压。
3. 解决过程(Action)
3.1 监控与诊断
- 工具链选择:
- JVM监控:通过
jstat -gcutil
实时观察内存分区(Eden、Survivor、Old Gen)使用率,发现老年代占用率在每次Young GC后仍持续上升。
- JVM监控:通过
- GC日志分析:
启用详细GC日志(-Xlog:gc*,gc+heap=debug:file=gc.log),结合工具(如GCViewer、GCEasy)分析GC原因。
关注 Full GC 触发原因(如 Metadata GC Threshold、Ergonomics)。 - Prometheus + Grafana监控:
集成JVM Exporter,实时监控内存分区使用率、GC次数与耗时。
设置告警规则(如老年代内存占用超过80%触发告警)。 - 根因定位:
- MAT分析结果:发现
ConcurrentHashMap
中缓存了历史风控规则对象(单条规则大小约2KB),总量超过500万条,占老年代内存的85%。 - 代码审查:规则引擎在每次规则更新时,将新规则添加到静态Map中,但未清理过期规则,导致缓存无限增长。
- MAT分析结果:发现
3.2 优化方案设计
-
缓存策略重构:
- 数据结构替换:将静态
ConcurrentHashMap
改为WeakHashMap
,利用弱引用特性,允许JVM在内存不足时自动回收未被引用的规则。 - 定期清理机制:增加定时任务(通过Spring
@Scheduled
),每天凌晨清理3天前的历史规则。 - 代码示例:
public class RuleCache {private static Map<String, SoftReference<Rule>> ruleCache = new WeakHashMap<>();@Scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点清理public void cleanExpiredRules() {ruleCache.entrySet().removeIf(entry -> entry.getValue().get() == null || entry.getValue().get().isExpired());} }
- 数据结构替换:将静态
-
垃圾回收器调优:
- 更换垃圾回收器:从默认的Parallel GC切换为G1 GC,利用其分区回收和预测停顿时间的特性。
- 参数调整:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 # 目标停顿时间200ms -XX:InitiatingHeapOccupancyPercent=45 # 更早启动并发标记 -XX:G1HeapRegionSize=8m # 根据堆大小调整Region
3.3 验证与兜底
- 压测验证:
- 使用JMeter模拟峰值流量(QPS 6000),持续运行24小时,Full GC频率降至每天1次,平均停顿时间180ms。
- 监控加固:
- 在Prometheus中配置GC停顿告警规则(如1分钟内Full GC次数 > 1),并集成到运维告警平台。
- 通过Grafana可视化GC时间分布和内存使用趋势。
4. 成果与价值(Result)
- 性能提升:
- Full GC频率从每小时3次降至每天1次,平均停顿时间从3秒缩短至180ms。
- 系统吞吐量恢复至优化前水平,RT稳定在50ms以内。
- 资源优化:
- 老年代内存占用减少70%,容器内存申请从16GB降至10GB,节省云资源成本约20%。
- 经验沉淀:
- 输出《JVM内存泄漏排查指南》和《G1调优手册》,推动团队建立周期性GC健康检查机制。
5. 技术深度扩展
- WeakHashMap的局限性:
- 弱引用仅在下一次GC时被回收,若业务要求精确控制缓存生命周期,需结合ReferenceQueue主动清理。
- G1调优进阶:
- 通过
-XX:G1ReservePercent=10
预留空间,避免晋升失败(Evacuation Failure)。 - 监控G1的
Mixed GC
效率,调整-XX:G1MixedGCLiveThresholdPercent
优化回收阈值。
- 通过
6. 总结
通过本次优化,不仅解决了Full GC导致的系统卡顿问题,还深化了对JVM内存管理机制的理解。关键收获包括:
- 工具链的熟练应用:MAT堆转储分析、G1调参技巧。
- 缓存设计的权衡:强引用与弱引用的适用场景、缓存过期策略的实现。
- 系统性思维:从代码优化到架构调整的全链路闭环解决能力。
这一经历充分体现了在高并发场景下,通过精准定位和科学调优保障系统稳定性的实战能力。
相关文章:
JVM生产环境调优实战
案例三:JVM频繁Full GC优化 1. 项目背景(Situation) 在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000&a…...
Python: sqlite3.OperationalError: no such table: ***解析
出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案: 步骤 1:创建数据库表 在插入数据前,必须先执行建表语句。请通过以下任一方式创建表: 方式一:使用 SQLite 命令行 bash 复制 # 进入 SQLit…...
JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道
"此刻正是奇点编译的第3.1415926秒!伏羲的算筹正在撕裂冯诺依曼架构的次元壁!诸君请看——这JVM堆内存中正在孕育盘古的元神!" 目录(终极扩展) 第一章:太极二进——内存模型的阴阳交缠 第二章&a…...
Python 字典和集合(字典推导)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典推导 自 Python 2.7 …...
【AI】prompt engineering
prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…...
小刚说C语言刷题——第18讲 循环之while和do-while语句
昨天我们讲了循环语句中的for语句,它主要用于循环次数已知的情况,但是对应循环次数未知的情况,我们又怎么办?这就要用到while和do-while语句了。 1.while语句 (1)语法格式 while(条件表达式) { 循环体; } (2)执行过程 当执…...
[Mysql]buffersize修改
1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld...
自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
自定义数据结构放入QVariant,在序列化时抛出异常 ASSERT failure in QVariant::save: “invalid type to save” 自定义数据结构如struct MyData,除了要在结构体后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的输入输出&…...
带约束的智能优化算法
带约束的智能优化算法 约束条件和优化问题(可改)粒子群算法麻雀搜索算法鲸鱼优化算法灰狼优化算法免疫优化算法人工蜂群算法沙猫群算法萤火虫算法资源 约束条件和优化问题(可改) 粒子群算法 麻雀搜索算法 鲸鱼优化算法 灰狼优化算法 免疫优化算法 人工蜂群算法 沙猫群算法 萤火…...
【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析
🌟【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析🌟 📜 前言:当传统棋艺遇上人工智能 五子棋作为中国传统棋类游戏,规则简单却变化无穷。本文将带你用纯前端技术实现一个具备AI对战功能…...
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南 本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。 目录 前提条件参考文档…...
华为OD全流程解析+备考攻略+经验分享
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
数据库中的数组: MySQL与StarRocks的数组操作解析
在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…...
Qt 交叉编译详细配置指南
一、Qt 交叉编译详细配置 1. 准备工作 1.1 安装交叉编译工具链 # 例如安装ARM工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 准备目标…...
【详细图文】在VScode中配置python开发环境
目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode (1)已自动下载汉化版插件 (2)未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python (1)双击打开…...
strings.Fields 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:解析服务器日志 示例3:清理用户输入 8. 性能比较 性能特点 对比表…...
PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
步骤 1.全套证书已经生成。OK 2.找国芯要ECC加密解密签名验签代码。给的逻辑说明没有示例代码很难的上。 3.集成到工具 与SP联调。 1.用openssl全套证书生成及验证 注意:这里CA 签发 KLD 证书用的是SHA256。因为芯片只支持SHA256算法,不支持SHA512。改成统一。…...
微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
微软 SC-900 认证介绍 SC-900 认证考试是微软推出的一项基础级别认证,全称为 Microsoft Certified: Security, Compliance, and Identity Fundamentals。该认证旨在验证考生对微软云服务(如 Azure 和 Microsoft 365)中的安全、合规和身份管理…...
Uniapp 集成极光推送(JPush)完整指南
文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一:使用UniPush(推荐)方法二:手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…...
OpenCV图像平滑处理方法详解
文章目录 引言一、什么是图像平滑?二、常见的图像平滑方法1.先对图片加上噪声点2. 均值滤波(Averaging)3. 方框滤波(boxFilter)4. 中值滤波(Median Blur)5. 高斯滤波(Gaussian Blur&…...
Lua 中,`math.random` 的详细用法
在 Lua 中,math.random 是用于生成伪随机数的核心函数。以下是其详细用法、注意事项及常见问题的解决方案: Lua 中,math.random 的详细用法—目录 一、基础用法1. 生成随机浮点数(0 ≤ x < 1)2. 生成指定范围的随机…...
使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
目录 一.方法一(没成功) 1.运行PX4 2.运行mavros通讯 3.启动仿真世界和无人机 (1)单独测试相机 (2)make px4_sitl gazebo启动四旋翼iris无人机 二.方法二(成功) 1.通过 rosl…...
ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件
该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 文章目录 Permake5为什么使用 Premake? 项目实战总结一下:详细代码: Permake5 Premake5 是一个跨平台的构建配置工具,它允许开发者通过使用一个简单的脚…...
equals() 和 hashCode()
作为 Java 开发者,我们经常会用到 equals() 和 hashCode() 这两个方法。 它们是 Object 类中定义的基础方法,看似简单,但如果理解不透彻,很容易在实际开发中踩坑。 本文将深入探讨这两个方法的作用、区别、以及如何正确地重写它们…...
臭氧除菌柜市场报告:2031年全球臭氧除菌柜市场销售额预计将达到9.4亿元
一、市场概述 (一)定义与分类 臭氧除菌柜,作为新一代绿色消毒设备,主要利用臭氧(O₃)的强氧化性来实现无化学残留的消毒净化。根据产品类型,可分为单门型和双门型。单门型设计紧凑,…...
解决python manage.py shell ModuleNotFoundError: No module named xxx
报错如下: python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…...
通用接口函数注册模块设计与实现
文章目录 通用接口函数注册模块设计与实现1. 模块概述2. 核心功能2.1 数据结构函数注册项结构体注册函数宏 2.2 核心函数实现函数:sl_register_interface_functions 3. 使用示例3.1 基础使用示例 - 设备驱动接口定义接口结构体实现具体函数创建注册表注册接口 3.2 高…...
C,C++,C#
C、C 和 C# 是三种不同的编程语言,虽然它们名称相似,但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别: 1. 设计目标和历史 语言诞生时间设计目标特点C1972(贝尔实验室)面向过程&#…...
scala-集合3
集合计算高级函数 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 (筛选出满足条件的元素组成新集合。) 转换或映射(map):将原始集合中的元素映射到某个函数。 扁平化:取消…...
Spring MVC 重定向(Redirect)详解
Spring MVC 重定向(Redirect)详解 1. 核心概念与作用 重定向(Redirect) 是 Spring MVC 中一种客户端重定向机制,通过 HTTP 302 状态码(默认)将用户浏览器重定向到指定 URL。 主要用途…...
Scala的集合(二)
1. 集合计算高集函数 任务要求 1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 2)转化/映射(map):将集合中的每一个元素映射到某一个函数 3)扁平化 4)扁平化映射 注:flatMap 相当于先进行 map 操作&#…...
GZ036区块链卷三 EtherGame合约漏洞详解
题目 pragma solidity ^0.8.3; contract EtherGame {uint public targetAmount 7 ether;address public winner;function deposit() public payable {require(msg.value 1 ether, "You can only send 1 Ether");uint balance address(this).balance;require(bala…...
BGP路由协议之路由通告/传递
BGP 的路由宣告 BGP 自身并不会发现并计算产生路由,只会将 IGP 路由表中的路由引入到 BGP 路由表中,并通过 Update 报文传递给 BGP 对等体(邻居) Network 宣告,前提是路由表中存在该条路由 import-route 引…...
Python合并多个pdf
场景: 现在要解决批量合并PDF的问题。 有很多PDF文件需要合并成一个,比如报告、发票或者多个章节的文档。 对于Windows用户,Adobe Acrobat是专业的选择,但需要付费。但是我不想花钱,所以推荐免费软件,比…...
聊一聊接口测试时遇到上下游依赖时该如何测试
目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法(变量提取) 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例(以订单接口测试为例) 3.1Mock依赖接口&…...
pdf转latex
Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…...
剖析 Docker Swarm 操作对原有容器端口影响
剖析 Docker Swarm 操作对容器端口影响 一、背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况。期间涉及 docker swarm init --advertise-addr172.16.10.110 以及 docker swarm join…...
QML面试笔记--UI设计篇02布局控件
1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 总结 1. QML 中常用的布局控件 1.1. Row 背景知识:Row 布局用于将子元素水平排列,适合简单的线性布局,如工具栏按钮或表单输入…...
Java全栈项目--校园快递管理与配送系统(4)
源代码续 /*** 通知工具类*/// 通知类型常量 export const NotificationType {SYSTEM: 1,EXPRESS: 2,ACTIVITY: 3 }// 通知类型名称映射 export const NotificationTypeNames {[NotificationType.SYSTEM]: 系统通知,[NotificationType.EXPRESS]: 快递通知,[NotificationType…...
c语言练习一
1、统计二进制数中1的个数 #include <stdio.h>int main(void) {int count 0; //统计1出现次数 int x 0b1011;while(x){count ;//x 0b1011 > x-1 0b1010 x-1,将x从右往左数遇到第一个1变成0,左边全部变为1,右边不变 //x&x-1 1010 …...
Scala安装
Spark安装 Spark的Local模式仅需要单个虚拟机节点即可,无需启动hadoop集群。实验步骤如下: 将spark的安装包上传到虚拟机node01中(建议路径:/opt/software/spark)并解压缩文件。将解压文件夹重命名为spark-local 解…...
爱普生RTC模块RA8804CE在ADAS域控制器的应用
在汽车智能化、自动化飞速发展的时代,ADAS(高级驾驶辅助系统)的多传感器融合与实时决策高度依赖精准的时间基准。毫秒级的时间偏差可能导致传感器数据错位,直接影响行车安全。爱普生RA8804CE实时时钟模块凭借其内置的32.768 kHz晶…...
开箱即用!推荐一款Python开源项目:DashGo,支持定制改造为测试平台!
大家好,我是狂师。 市面上的开源后台管理系统项目层出不穷,对应所使用到的技术栈也不尽相同。 今天给大家推荐一款开源后台管理系统: DashGo,不仅部署起来非常的简单,而且它是基于Python技术栈实现的,使得基于它进行…...
C++使用WebView2控件,通过IPC通信与Javascript交互
引言 在现代桌面应用程序开发中,Web技术与原生应用的融合变得越来越普遍。Microsoft的WebView2控件为C开发者提供了一个强大的工具,使他们能够在桌面应用中嵌入基于Chromium的Web浏览器引擎。本文将详细介绍如何在C应用程序中使用WebView2控件ÿ…...
算法中Hash备胎——LRU的设计与实现
核心内容1.理解LRU的原理2.理解LRU是如何实现的3.能够通过代码实现LRU 缓存是应用软件的必备功能之一,在操作系统、Java里的Spring、mybatis、redis、mysql等软件中都有自己的内部缓存模块,而缓存是如何实现的? 在操作系统教科书里我们知道…...
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路 在现代化印刷厂的生产线上,高效稳定的设备通信是保障印刷质量和生产效率的关键。某印刷厂的印刷机控制系统采用了西门子PLC进行自动化控制,同时还有众多基于ModbusRTU协议的传感器和…...
Spring中使用Kafka的详细配置,以及如何集成 KRaft 模式的 Kafka
在 Spring 中使用 Apache Kafka 的配置主要涉及 Spring Boot Starter for Kafka,而开启 KRaft 模式(Kafka 的元数据管理新模式,替代 ZooKeeper)需要特定的 Kafka Broker 配置。以下是详细步骤: 一、Spring 中集成 …...
C++之继承
本节我们将要学习C作为面向对象语言的三大特性之一的继承。 前言 一、继承的概念 二、继承的定义 2.1 定义格式 2.2 继承基类成员访问方式的变化 2.3 继承类模板 三、基类和派生类之间的转换 四、继承中的作用域 五、派生类的默认成员函数 六、实现一个不能被继承的类 七、继承…...
服务器申请 SSL 证书注意事项
一、确认证书类型 基础域名型(DV):这类证书验证速度最快,通常只需验证域名所有权,几分钟到几小时即可颁发。适用于个人博客、小型企业展示网站等对安全性要求不是顶级严苛,且急需启用 HTTPS 的场景。但它仅…...
【资料分享】全志T536(异构多核ARMCortex-A55+玄铁E907 RISC-V)工业核心板说明书
核心板简介 创龙科技SOM-TLT536是一款基于全志科技T536MX-CEN2/T536MX-CXX四核ARM Cortex-A55 +...