线上CPU飙升,问题定位
程序员文章站
2022-06-09 15:02:31
...
1、定位到cpu最高PID
top
2、将线程PID转换为 16进制
为后面查找 jstack 日志做准备
#查看进程内最耗费CPU的线程
top -Hp pid
#该进程id是10进制的,需要转为16进制
printf “%x” PID
注意 (1)可以直接查找jstack数据
jstack PID | grep 54ee
(2)也可以通过以下步骤导出日志文件
3、导出top中cpu最高PID时实时栈文件
jstack PID > xx.log
4、分析栈文件,查询文件中线程状态:
java.lang.Thread.State:
BLOCKED过多:表示程序中有死锁的代码
RUNNABLE过多:表示程序一直在处理,检查是否有死循环
WAITING:无限等待另一个线程执行一个特定动作
关注WAITING ,BLOCKED的地方 可以初步定位到问题所在。
5、jmap导出top中cpu最高PID 的dump文件
注意点:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
导出整个JVM 中内存信息
jmap -dump:live,format=b,file=/文件路径/heap-dump.bin PID
6、分析dump文件
使用JDK下的jvisualvm.exe工具分析。 排查非基本数据类型 实例数和内存占用较高的包。定位到业务代码
【建议每次间隔一段时间,便导出dump文件,多个文件对比分析,单次的dump文件参考意义不大】