今天收到客服報警,系統無法登錄。登錄服務器後看到tomcat進程存在,top命令發現進程佔用CPU2000%多。該服務裏面跑了很多線程,於是想找到是誰引起的
1、首先dump出該進程的所有線程及狀態
使用命令 jstack PID 命令打印出CPU佔用過高進程的線程棧.
jstack -l <PID> > PID.stack
將進程的線程棧輸出到了文件
2、使用top命令找到耗cpu的線程
使用top -H -p PID 命令查看對應進程是哪個線程佔用CPU過高.
top -H -p <PID>
3. 將線程的pid 轉成16進制,比如22138 = 567a
printf "%x\n" <PID>
4. 到第一步dump出來的文件中搜索得到的16進制線程號,就知道是哪個線程了
"schedulerFactory_Worker-29" prio=10 tid=0x00002aaab0505000 nid=0x567a runnable [0x000000004db47000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114) at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161) at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189) - locked <0x00000007bc90fdb0> (a com.mysql.jdbc.util.ReadAheadInputStream) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2549) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2991) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3532) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) at