使用 Linux 命令检查 CPU 过高问题
top + jstack
1. 使用 top 命令查看CPU占用最高的进程:36032
2. 使用 top -Hp 36032 查看 36032 这个进程里线程运行的信息。从结果可以看出 36044 这个线程是Cpu占用率最高的
3. 使用 printf %x 36044 把 36044 转换为16进制,得到 8ccc .
4. 使用 jstack 36032 > 1.txt 去dump Cpu过高的进程,把结果输出到1.txt
5. cat 1.txt | grep -A 30 8ccc 查看 1.txt 文件,在文件中搜索 包含8ccc 的这一行,并往后输出30行。 这样就可以定位到哪一行代码
JMC
Jmc 可以通过界面查看到CPU过高的问题。但是前提需要服务器开启 JMX ,通过JMX 连接。
可能导致Cpu占用率过高的问题月解决方案
- 无限 while 循环
- 频繁GC
- 频繁创建新对象
- 合理使用单例
- 序列化和反序列化
- 选择合理的API功能
- 正则表达式
- 减少字符匹配期间执行的回溯。降低回溯的发生。
- 频繁的上下文切换
- 应用中有很多线程,线程做争抢,线程频繁在 block 和 running之间切换就可能造成Cpu过高