1 CPU使用率过高问题定位
1.1 配合使用top+jstack定位(重要)
首先使用top
找到CPU使用率最高的进程。
接着查看36032进程的线程情况。
top -Hp 36032
找到36044线程CPU占用率最高,然后将线程号转为16进制。
# printf %x 36044
8ccc
最后,使用jstack dump 36032进程的日志到1.txt文件。匹配8ccc之后打印后面30行,从而定位到问题代码行数。
# jstack 36032 > 1.txt
# cat 1.txt | grep -A 30 8ccc
备注:top定位的线程号是十进制的,而jstack dump出来的是十六进制的。
1.2 使用JMC查看线程情况
利用JFR动态监控出线程情况。
1.3 CPU使用过高的场景
- 使用无限循环==>尽量避免
- 频繁GC,GC线程争用CPU资源==>降低GC频率
- 频繁创建新对象==>合理使用单例以及线程池
- 序列化和反序列化(例如解析操作)==>选用合理的API实现;选用好用的类库
- 不合理地使用正则表达式(正则表达式引擎在进行字符匹配时会发生回溯)==>尽量使正则匹配不回溯。
- 频繁的线程上下文切换。==>业务改造,减低频率。