Spring Boot性能瓶颈分析
性能瓶颈定位需要系统性方法论和工具支撑。
分析流程
Bash
现象观察 -> 指标采集 -> 瓶颈定位 -> 根因分析 -> 优化验证
CPU瓶颈分析
定位命令
Bash
# 查看CPU使用率
top -Hp <pid>
# 生成线程转储
jstack <pid> > thread_dump.txt
# 查看热点方法
jmap -histo:live <pid>
常见问题
| 现象 | 原因 | 解决方案 |
|---|---|---|
| CPU 100% | 死循环、正则回溯 | 检查热点代码 |
| CPU 波动大 | GC频繁 | 调整堆内存 |
| 多核不均衡 | 锁竞争 | 减少锁粒度 |
Arthas诊断
Bash
# 安装启动
java -jar arthas-boot.jar
# 监控方法执行耗时
watch com.example.UserService getUser '{params,returnObj,rt}'
# 追踪调用链路
trace com.example.UserService getUser -n 5
# 火焰图分析
profiler start
profiler stop
内存瓶颈分析
内存分析工具
Bash
# 堆内存快照
jmap -dump:format=b,file=heap.hprof <pid>
# GC日志分析
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
Memory Analyzer (MAT) 使用
- 导入 heap.hprof 文件
- 查看 Leak Suspects 报告
- 分析 Dominator Tree
- 查找大对象和GC Root
常见内存问题
| 问题 | 表现 | 解决 |
|---|---|---|
| 内存泄漏 | Old区持续增长 | MAT分析引用链 |
| 对象过多 | Young GC频繁 | 减少对象创建 |
| 堆不足 | OOM异常 | 增大-Xmx |
IO瓶颈分析
磁盘IO
Bash
# 查看磁盘IO
iostat -x 1
# 关注指标
%util: 设备利用率
await: 平均等待时间
svctm: 平均服务时间
网络IO
Java
# 查看网络连接
netstat -anp | grep <pid>
# 抓包分析
tcpdump -i eth0 port 8080 -w capture.pcap
优化策略
Java
// 异步IO减少阻塞
@Async
public CompletableFuture<Result> asyncProcess() {
return CompletableFuture.completedFuture(doWork());
}
// 批量处理减少IO次数
@Transactional
public void batchInsert(List<Entity> entities) {
jdbcTemplate.batchUpdate(sql, entities);
}
线程瓶颈分析
线程池监控
Bash
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("async-");
executor.initialize();
return executor;
}
// 监控线程池状态
executor.getPoolSize();
executor.getActiveCount();
executor.getQueue().size();
线程死锁排查
SQL
# jstack检测死锁
jstack <pid> | grep -A 10 "deadlock"
# Arthas检测
thread -b
数据库瓶颈
慢查询定位
YAML
-- MySQL开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 分析慢查询
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
连接池监控
text
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
leak-detection-threshold: 60000
瓶颈分析需结合多个维度,通常 CPU、内存、IO、网络、数据库交叉分析。
要点总结
- CPU高:用Arthas追踪热点方法
- 内存问题:MAT分析堆转储
- IO瓶颈:异步化和批量处理
- 线程问题:监控线程池状态
- 数据库:慢查询和连接池优化
📝 发现内容有误?点击此处直接编辑