问题:系统cpu突然飙高,联系运维打印线程栈
1.通过日志查询到:
- com.galaxy.routem.core.rpc.service.RoutemRpcServiceIpml.routelineShifts(com.galaxy.routem.api.vo.ShiftParamsVo) @bci=399, line=282 (Compiled frame)
282行导致死循环
2.修改代码优化上线,解决问题
3.代码中禁止写while(true) 等死循环
排查CPU飙高的方式
方案一:
top -c查看cpu和内存使用率最高的进程pid
\
2.使用top -Hp 1045查看进程中占用cpu最多的线程TID
\
\
3.使用命令printf "%x\n" 1045把线程pid转换成16进制数,得到:415。
\
4.使用jstack 1045 | grep -20 415命令查询该线程阻塞的地方。
\
\
方案二:
使用Arthas分析高CPU问题 阿尔撒斯
curl -O alibaba.github.io/arthas/arth…
java -jar arthas-boot.jar
\
\
输入1 进行监听
\
thread -n 3 查看下最忙的3线程
\
dashboard命令用于整体展示进程所有线程、内存、GC等情况,其输出如下
\
退出:exit
主要原因:
1.代码 中的死循环会导致CPU飙高(一般突然飙高的主要原因)
- 大量并发的I/O操作
3.老年代不够导致 频繁GC