优化需从初期嵌入数据记录:统一基准(相同jvm参数、固定硬件、充分预热、清空干扰)、分层采集(方法级/jmh、系统级/pidstat、jvm级/gc日志、依赖级/单独埋点)、表格化对比(含工具/样本量/置信区间)、可视化验证(火焰图、分位数曲线、gc直方图)。

记录和对比优化数据不是“做完再记”,而是从调优一开始就要嵌入流程——没有可复现、可量化的数据,就谈不上真实优化。关键在于统一基准、隔离变量、分层采集,并让每次改动都有对应的数据锚点。
明确基准测试条件
所有对比必须基于同一套可控环境,否则数据不可比:
- 使用相同JVM参数(堆大小、GC算法、JIT开关等),避免因GC波动干扰响应时间
- 固定硬件资源:关闭CPU频率动态调整(如禁用intel_pstate)、绑定测试进程到独占CPU核
- 预热充分:JMH默认执行10轮预热;自测代码需手动循环调用目标方法至少1万次,确保JIT编译完成
- 清空干扰:测试前停掉无关进程、禁用监控Agent(如SkyWalking探针)、关闭日志异步刷盘(避免IO抖动)
分层采集核心指标
单一耗时数字掩盖太多信息,需按层级同步采集:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 方法级:用JMH测微基准(纳秒级),或Spring StopWatch+日志打点统计业务方法平均/99分位耗时
-
系统级:用
pidstat -wt -p <pid></pid>抓线程上下文切换次数,用vmstat 1 30看中断和软中断占比 -
JVM级:开启
-Xlog:gc*:file=gc.log:time,uptime,用GCEasy分析Full GC间隔与STW时长变化 - 依赖级:对DB/Redis/HTTP调用单独埋点,区分网络延迟、序列化开销、服务端处理时间
设计可对比的数据结构
避免“优化前234ms,优化后187ms”这类模糊描述,推荐表格化记录:
| 场景 | 指标 | 优化前 | 优化后 | 提升 | 备注 |
|---|---|---|---|---|---|
| 用户查询接口 | p99响应时间 | 428 ms | 196 ms | -54% | 引入本地缓存 + 预热机制 |
| 批量导入任务 | 每千条耗时 | 3120 ms | 1480 ms | -53% | 改用PreparedStatement批处理 |
| JVM运行态 | Young GC频率 | 12次/分钟 | 3次/分钟 | -75% | 对象复用 + StringBuilder替代+拼接 |
每项数据标注采集工具(如“JMH 1.37 / JDK 17.0.2”)、样本量(如“10轮,每轮10万次”)、置信区间(JMH自动输出误差±值)。
用可视化验证趋势
数值易被误读,图形能暴露隐藏问题:
- 用JProfiler或Async-Profiler生成火焰图,对比优化前后热点方法宽度变化
- 用Prometheus+Grafana绘制响应时间分位数曲线,观察p95是否同步下降(避免仅p50改善)
- 导出GC日志到GCViewer,叠加对比两次Full GC的停顿分布直方图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










