JVM 调优黄金三步法:监控→分析→验证

作者:老K的Java兵器库日期:2025/10/19

JVM 调优黄金三步法:监控→分析→验证

(方法论 + 案例 + 压测验证,新手也能照抄)

关键词:JVM 调优、监控、分析、验证、压测、方法论、黄金三步
阅读时长:20 min
环境:CentOS 7 + OpenJDK 8u342 + SpringBoot 1.5 + JMeter 5
适合:1~5 年 Java 开发、生产调优无思路、面试「JVM 怎么调优」标准答案


一、0 基础速记:黄金三步一句话

步骤目标一句话
监控发现瓶颈先知道「哪里慢」再动手
分析定位根因用数据证明「为什么慢」
验证确认效果用压测证明「真的快了」

口诀:「监控是眼睛,分析是大脑,验证是尺子」


二、实验场景:电商秒杀接口「下单」

指标优化前
压测工具JMeter 200 线程循环 300s
接口路径POST /order/create
响应时间P99 ≈ 500 ms
吞吐量≈ 400 QPS
服务器4C8G Docker,JDK 8u342

目标:P99 ≤ 50 ms,QPS ≥ 800,资源不增。


三、Step 1:监控——发现瓶颈

① 应用监控

1java -XX:+UseParallelGC -Xms2g -Xmx2g -Xloggc:/tmp/gc.log -XX:+PrintGCDetails \
2     -XX:+PrintGCTimeStamps -jar shop.jar
3

JMeter 压测中

1jstat -gc -t <pid> 5s
2
指标判定
YGC 平均耗时120 ms明显过长
FGC 次数2 次/5min频繁
EU 回收率30 %回收效果差

② 系统监控

1top -H -p <pid>
2
  • GC 线程占用 80 %GC 是瓶颈
  • 用户线程 20 %业务逻辑不慢

结论:「不是业务慢,是 GC 慢」——监控阶段完成。


四、Step 2:分析——定位根因

① GC 日志可视化

上传 gc.loggceasy.io

报告项建议
Avg Young GC Pause125 ms目标 < 50 ms
GC CauseAllocation Failure正常,但太大
Heap After GC1.6 G → 1.2 G回收量小

② 堆直方图

1jmap -histo <pid> | head -20
2
1num  instances bytes  class name
2----------------------------------
3  1:       123456  493824000  [B
4  2:        54321   13036800  java.lang.String
5

byte[] 占 95 %大缓存未淘汰

③ MAT 线下 dump

1jmap -dump:format=b,file=/tmp/order.hprof <pid>
2docker cp shop:/tmp/order.hprof .
3# MAT → Leak Suspects
4

报告

1One instance of "java.util.HashMap" occupies 480.5 MB (78.4 %)
2

Path to GC Roots

1OrderService.cache : HashMap → Node → byte[] → 480.5 MB
2

根因:静态 HashMap 无 LRU大对象无法释放GC 回收效果差回收时间拉长


五、Step 3:验证——参数+代码双优化

① 参数层:让 GC 变快

优化项原值新值理由
收集器ParallelGCG1GC低停顿
最大停顿默认-XX:MaxGCPauseMillis=50明确目标
并行线程默认 4-XX:ParallelGCThreads=84C→8 逻辑核
堆大小2g-Xms4g -Xmx4g增大 Eden,降低 YGC 频次

参数层 单点验证只改 GC,业务代码不动

② 代码层:让对象变少

1// 优化前:无淘汰静态 HashMap
2private static final Map<String, byte[]> CACHE = new HashMap<>();
3
4// 优化后:LRU + WeakReference
5private static final Map<String, WeakReference<byte[]>> CACHE =
6        Collections.synchronizedMap(new LinkedHashMap<String, WeakReference<byte[]>>(16_384, 0.75f, true){
7            protected boolean removeEldestEntry(Map.Entry eldest) {
8                return size() > 16_384;
9            }
10        });
11

③ 压测验证

同场景 JMeter 复压

指标优化前优化后降幅
P99500 ms45 ms91 %
YGC 平均120 ms28 ms77 %
QPS400850112 %
CPU 消耗80 % GC25 % GC69 %

参数+代码双优化目标全部达成资源未增加


六、统一模板:黄金三步 SOP(生产复制即用)

阶段工具及格线优秀线
监控jstat+top发现瓶颈量化指标
分析gc.log+MAT定位根因给出修复方案
验证JMeter达标超预期+资源不变

每步 必须量化拒绝“感觉快了”


七、面试 6 连问(背就行)

Q1 JVM 调优第一步?
A:监控,先量化瓶颈(jstat、gc.log、top)

Q2 如何判断 GC 还是业务慢?
A:top 看 GC 线程 CPU vs 用户线程 CPU

Q3 G1 比 ParallelGC 快在哪?
A:Region 模型 + 可预测停顿,MaxGCPauseMillis 明确目标

Q4 大对象缓存如何不泄漏?
A:LRU + WeakReference,用完自动被 GC

Q5 调优后如何证明有效?
A:同场景压测,对比 P99、QPS、CPU 三指标

Q6 一句话背走黄金三步?
先监控找瓶颈,再分析找根因,最后压测验结果


八、小结:一张思维导图(收藏即可)

1JVM 调优
2├─ 监控 ──► jstat+top+gc.log → 发现瓶颈
3├─ 分析 ──► MAT+LRU+WeakReference → 定位根因
4└─ 验证 ──► JMeter 压测 → P99 ↓90% + QPS ↑112%
5

没有调不优的 JVM,只有没量化的步骤!


九、下集预告

《高并发电商系统 JVM 调优实战:从 500ms 到 50ms 的优化之路》
将带你 完整电商秒杀链路缓存预热 + MQ削峰 + G1调优 + 火焰图定位,欢迎点个关注不迷路!


JVM 调优黄金三步法:监控→分析→验证》 是转载文章,点击查看原文


相关推荐


Windows下Jenkins服务未自动重启问题解决
一张假钞2025/10/18

个人博客地址:Windows下Jenkins服务未自动重启问题解决 | 一张假钞的真实世界 成功安装 Jenkins 服务后,有时开机后 Jenkins 服务未自动启动。查看 Jenkins 服务安装目录下的日志发现没有服务启动的日志,所以猜测是系统启动后 Jenkins 服务未调起。 通过按 Win + R,然后输入 services.msc 并按回车来打开服务管理工具。找到 Jenkins 服务,点击右键,查看“属性”,Jenkins 默认设置如下: 为了每次开机能自动启动 Jen


【ComfyUI】电商模特面部融合
Mr数据杨2025/10/16

今天给大家展示一个 适用于相同脸型商品图生成的ComfyUI工作流,该工作流可高效处理两张来源图像,经过面部对齐、区域裁剪、图像融合与生成过程,快速构建视觉一致性强、适用于电商场景的最终图像输出。整体流程融合了 FluxKontext 模型推理、面部区域对齐处理、条件控制生成以及结果拼接输出等关键模块,极大提升图像一致性与真实感,适用于商品营销图、模特换穿搭图、广告图生成等多种需求场景。 文章目录 工作流介绍核心模型Node节点 工作流程应用场景开发与应用 工作流介绍 本工


ELK运维之路(Logstash7&Kibana接入ES集群-7.17.24)
会飞的小蛮猪2025/10/15

书接前文,本章介绍Logstash和Kibana组件的部署,测试环境哦别干生产,如有帮助到您请给个免费的赞呗! 1.Logstash 1.1 Docker-compose 配置片段 root@ubuntu2204test99:~/elkf# vi docker-compose.yml logstash: image: logstash:7.17.24 container_name: logstash-7.17.24 restart: always en


智能合约在分布式密钥管理系统中的应用
安当加密2025/10/14

非常好的问题!下面我将用通俗易懂 + 技术准确的方式,为你详细解释: 一、什么是智能合约(Smart Contract)? 简单比喻: 智能合约 = 自动售货机 你投入硬币(输入条件);机器自动判断金额是否足够(逻辑判断);如果满足,自动掉出饮料(执行结果);全程无需店员介入,规则透明、自动执行。 技术定义: 智能合约是运行在区块链上的、可编程的、自动执行的协议代码。它: 以代码形式定义规则(如“只有A和B同时签名,才能使用密钥”);部署在区块链上,不可篡改;当预设条件满足时,自动执行(


触摸未来2025.10.12:图景之锚,在多模态记忆中寻找记忆的本质
可触的未来,发芽的智生2025/10/12

《图景之锚:在多模态记忆中寻找记忆的本质》   心理学与神经认知科学的研究如一道强光,照进了我混沌的实验思路。个体的记忆并非以语言形式储存,而是以图景、场面、动作、感官体验等多模态图式构成的——这个发现让我重新审视了整个记忆系统的理论基础。   ---   我开始理解,在我们为事物命名之前,个体拥有的是一种极其丰富而未被语言化的记忆场域。那个场域里充斥着光影的流动、温度的变迁、肌体的触感、情绪的波动。这些原始的记忆素材如同未加工的宝石,散落在意识的各个角落。   命名所做的,


苦练Python第63天:零基础玩转TOML配置读写,tomllib模块实战
倔强青铜三 VIP.1 初学乍练2025/10/11

前言 大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连! 欢迎来到苦练Python第63天! 今天继续啃下另一只“配置文件界的瑞士军刀”——TOML。 TOML是Tom’s Obvious, Minimal Language的简写。 Python 3.11 起,标准库自带 tomllib,开箱即用,零依赖! 一、TOML 是什么?能做什么? 和 JSON、YAML 并列的三大配置文件格式之一。 像 .ini 的升级豪华版:支持嵌套表、数组、日期时间、


1688 店铺商品全量采集与智能分析:从接口调用到供应链数据挖掘
一人の梅雨2025/10/9

一、技术定位与商业价值重构 1688 店铺商品接口(alibaba.item.list.get)作为获取店铺全量商品数据的核心入口,其价值远不止于简单的数据采集。与常规实现不同,本文方案聚焦B 端供应链数据的深度挖掘,通过商品结构化解析、价格策略分析、供应链能力评估三大维度,解决批发商关注的 "店铺品类布局"" 批量采购议价空间 ""供应商履约能力" 等核心问题,构建从数据采集到商业决策的完整技术链路。 区别于网络上常见的基础调用示例,本方案实现三大突破: 支持全量商品智能分页(突破单页限


Redis Zset 类型全解析
gsfl2025/10/8

文章目录 1.引言2.Zset 类型的核心特性与 Set、List 的关键差异 3.Zset 类型核心命令3.1 元素添加与基础查询:zadd、zrangezaddzrange 3.2 元素计数:zcard、zcountzcardzcount 3.3 排序与排名查询:zrevrange、zrangebyscore、zrank、zrevrank、zscorezrevrangezrangebyscorezrankzrevrankzscore 3.4 元素删除:zpopmax、


Python 的内置函数 bool
IMPYLH2025/10/6

Python 内建函数列表 > Python 的内置函数 bool 在编程中,我们经常需要判断某个值是“真”(True)还是“假”(False),而 bool() 函数就是 Python 提供的用于进行布尔值转换的强大工具。无论是数字、字符串、列表,还是自定义对象,bool() 都能帮助我们快速评估它们的真假状态。 bool 是一个类,它的参数如下: class bool(x=False): ''' 类型转换为 bool :param x: 一个变量 :r


【Linux CentOS 7 版本更换yum源】
zhaotiannuo_19982025/10/5

Linux CentOS 7 版本更换yum源 1、备份文件 cd /etc/yum.repos.d/ mkdir backup mv /etc/yum.repos.d/Cen* backup 2、下载文件 http://mirrors.aliyun.com/repo/Centos-7.repo 3、通过xftp 文件传输工具传输到/etc/yum.repos.d/目录下 4、清理软件源,建立缓存 yum clean all yum makecache 5、检查是否更新成功 yum repo

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0