分析java程序中佔用CPU過高的線程

今天收到客服報警,系統無法登錄。登錄服務器後看到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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章