问题定位
使用top
命令查看CPU占用率高的Java进程。记录PID(进程ID)和CPU占用率,以便后续分析。
top -c
获取线程信息
通过jstack
命令导出Java进程的线程堆栈信息。将PID替换为实际的进程ID。
jstack -l <PID> > jstack.log
分析线程状态
查看线程堆栈信息,找出占用CPU高的线程。通常需要关注RUNNABLE
状态的线程和频繁执行的代码块。
cat jstack.log | grep 'nid=' | grep 'RUNNABLE'
线程ID转换
将发现的线程ID(十六进制)转换为十进制,以便与top
命令中的线程ID匹配。
printf "%d\n" 0x<nid>
查看线程CPU使用
使用top
命令查看具体线程的CPU使用情况。替换<PID>为Java进程ID。
top -H -p <PID>
结合堆栈定位代码
根据线程ID和堆栈信息,定位到具体的Java类和方法。分析代码逻辑,查找可能的性能问题或死循环。
使用性能分析工具
对于更复杂的性能问题,可以使用jvisualvm
或async-profiler
工具进行深入分析。
jvisualvm
./profiler.sh -d <duration> -f <output.html> <PID>
内存和GC检查
检查内存使用和GC情况,排除因频繁GC导致的CPU飙高。
jstat -gcutil <PID> 1000
优化建议
根据分析结果优化代码,如减少循环次数、优化算法、使用缓存等。对于IO密集型任务,考虑异步处理或增加线程池大小。
排查步骤----四部曲:
1.top
2.top -Hp <pid>
3.printf "%x\n" tid
4.jstack pid | grep <oxtid> -A 20
例子:
1.top
2.top -Hp 10254
3. printf "%x\n" 10400
4.jstack 10254 | grep 28a0 -A 20