Java线上应用故障排查之一:高CPU占用

一个应用占用CPU很高,除了确实是计算密集型应用以外,一般缘由都是出现了死循环。java

以咱们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。tomcat

 

根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。.net

经过ps aux | grep PID命令,能够进一步肯定是tomcat进程出现了问题。可是,怎么定位到具体线程或者代码呢?线程

首先显示线程列表:blog

ps -mp pid -o THREAD,tid,time进程

 

找到了耗时最高的线程28802,占用CPU时间快两个小时了!get

其次将须要的线程ID转换为16进制格式:it

printf "%x\n" tidclass

 

最后打印线程的堆栈信息:监控

jstack pid |grep tid -A 30

找到出现问题的代码了!

接下来就是具体分析代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)

 

最后,总结下排查CPU故障的方法和技巧有哪些:

一、top命令:Linux命令。能够查看实时的CPU使用状况。也能够查看最近一段时间的CPU使用状况。

二、PS命令:Linux命令。强大的进程状态监控命令。能够查看进程以及进程中线程的当前CPU使用状况。属于当前状态的采样数据。

三、jstack:Java提供的命令。能够查看某个进程的当前线程栈运行状况。根据这个命令的输出能够定位某个进程的全部线程的当前运行状态、运行代码,以及是否死锁等等。

四、pstack:Linux命令。能够查看某个进程的当前线程栈运行状况。

相关文章
相关标签/搜索