在系统上线、压测或运行过程中,你是否遇到过这些场景?
明明服务器CPU很高,但不知道是哪个线程在消耗资源
压测吞吐量上不去,怀疑是数据库拖了后腿
GC频繁、内存飙升,找不到是哪个对象泄漏
某些请求偶发性超时,却又找不到根因
性能问题定位不是玄学,而是科学。
本文将全面拆解六类最常见的性能瓶颈,从定位思路到具体命令工具,帮助你系统性掌握实战技巧。
千万别“凭感觉”排查,跟着这个三步法走:
系统层先排查:CPU、内存、磁盘、网络是否异常?
应用层深入分析:JVM状态、线程运行情况、数据库调用等
外部依赖逐一验证:中间件、缓存、第三方接口是否超时/出错
CPU 使用率持续在 80~100%
响应慢,页面卡顿,甚至无法访问
top -d 1
观察 %us
(用户态)、%sy
(系统态)、%id
(空闲)数值。如果 %us
很高,说明是程序本身计算密集。
在 top
中按 Shift + P
,查看哪个进程最耗CPU。
top -Hp # 显示该进程所有线程
记录下线程号(TID),十进制格式。
将 TID 转为 16 进制:
printf '%x\n'
然后用 jstack
获取线程堆栈:
jstack | grep -A 20
./as.sh # 启动 arthas
thread # 查看线程排行
watch xxx.ClassName method 'returnObj' -x 3 # 查看执行详情
问题类型 | 现象说明 |
---|---|
死循环 | CPU持续占满,调用栈固定 |
热点方法频繁调用 | 单个类或方法反复出现在CPU热点中 |
锁竞争 | 多线程争用同一资源,导致上下文切换频繁 |
算法复杂 | 如O(n²)、递归未终止等问题引发高计算负载 |