查找占用cpu高的进程
top 命令参数
H: 查看线程信息
M(交互模式):根据驻留内存大小进行排序;
P(交互模式):根据CPU使用百分比大小进行排序;
top # 交互模式下按P键(ctrl + p) 查看cpu占用
查找该进程中占用CPU高的线程
ps 命令参数
-H:显示树状结构,表示程序间的相互关系。
e:选择所有进程
o: 输出格式
ps H -eo pid,tid,%cpu | grep <pid>
或者
top -Hp <pid>
使用jstack查找相应线程
jstack <pid> | grep <tid:hex-format>
结果含”VM Thread”, 表示为GC线程
其他的则定位源码进行排查
如果是Full GC次数过多
使用jmap导出dump文件
jmap -dump:format=b,file=<filename> <pid>
如果程序直接崩溃,则分析 jvm options指定的dump转储文件
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:/Users/nb/jvm/dump/file.hprof
分析转储文件,定位异常位置
常见的CPU占用过高的情况
- 内存不足,频繁Full GC
- CPU计算密集任务超出负荷
- 死锁
- 大量线程访问接口缓慢(网络时延,乐观锁的竞争,上下文切换 etc.)