CPU使用率过高问题定位

1 CPU使用率过高问题定位

1.1 配合使用top+jstack定位(重要)

首先使用top找到CPU使用率最高的进程。

CPU使用率过高问题定位

接着查看36032进程的线程情况。

top -Hp 36032

CPU使用率过高问题定位

找到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  

CPU使用率过高问题定位

备注:top定位的线程号是十进制的,而jstack dump出来的是十六进制的。

1.2 使用JMC查看线程情况

利用JFR动态监控出线程情况。

1.3 CPU使用过高的场景

  1. 使用无限循环==>尽量避免
  2. 频繁GC,GC线程争用CPU资源==>降低GC频率
  3. 频繁创建新对象==>合理使用单例以及线程池
  4. 序列化和反序列化(例如解析操作)==>选用合理的API实现;选用好用的类库
  5. 不合理地使用正则表达式(正则表达式引擎在进行字符匹配时会发生回溯)==>尽量使正则匹配不回溯。
    1. blog.csdn.net/ityouknow/article/details/80851338
  6. 频繁的线程上下文切换。==>业务改造,减低频率。
上一篇:JVM —— 内存泄漏排查及jps、jstat、jstack、jmap、jprofiler的使用


下一篇:查询Java运行占用内存过高的查找解决办法