CPU过高定位
top + jstack
1 top命令查看cpu占用最高的进程
top
这里看到36032进程最高
2 top -Hp pid查看进程中线程运行情况
top -Hp 36032
看到这个进程中线程的运行情况, 这里36044这个线程占用最高
3 printf %x 进程号转换成16进制
进程号转换成16进制,得到8ccc
printf %x 36044
4 jstack pid > 1.txt 查看该进程的堆栈状况
jstack 36032 > 1.txt
根据线程id查看问题线程的后面30行, 找到有问题的代码
cat 1.txt | grep -A 30 8ccc
CPU过高的场景有哪些:
- 无限循环 while
- 频繁GC , 需要降低收集频率
- 频繁创建新对象 , 需要合理使用单例
- 序列化和反序列化,大部分因为使用不合理的类库, 需要使用合理的api类库
- 正则表达式,字符串匹配时会频繁回溯,需要减少字符串匹配期间执行的回溯
- 频繁的线程上下文切换
参考: https://blog.csdn.net/weixin_44588186/article/details/124680586