分析java程序中cpu占用過高的線程


收到服務器報警,服務端的一個java服務占用cpu200%多。該服務里面跑了很多線程,於是想找到是誰引起的
1、首先dump出該進程的所有線程及狀態
使用命令 jstack PID 命令打印出CPU占用過高進程的線程棧.

jstack -l 5683 > 5683.stack

將進程id為5683的線程棧輸出到了文件

2、使用top命令找到耗cpu的線程
    使用top -H -p PID 命令查看對應進程是哪個線程占用CPU過高.

[goocar@LoginSVR ~]$ top -H -p 5683
top - 09:14:06 up 270 days, 18:33,  8 users,  load average: 7.94, 9.70, 10.31
Tasks:  48 total,   2 running,  46 sleeping,   0 stopped,   0 zombie
Cpu(s): 20.4% us, 30.5% sy,  0.0% ni, 43.8% id,  5.4% wa,  0.0% hi,  0.0% si
Mem:  16625616k total, 16498560k used,   127056k free,    22020k buffers
Swap: 16771820k total,  9362112k used,  7409708k free,  2224132k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
 5728 ecar    16   0 2442m 1.3g 288m R 38.3  8.4 208:06.62 java                                                                   
 5726 ecar    16   0 2442m 1.3g 288m S 37.3  8.4 209:08.91 java                                                                   
 5727 ecar    16   0 2442m 1.3g 288m R 37.3  8.4 213:14.04 java                                                                   
 5729 ecar    16   0 2442m 1.3g 288m S 35.6  8.4 211:39.23 java                                                                   
 5683 ecar    16   0 2442m 1.3g 288m S  0.0  8.4   0:00.00 java                                                                   
 5685 ecar    18   0 2442m 1.3g 288m S  0.0  8.4   0:01.62 java                                                                   
 5686 ecar    16   0 2442m 1.3g 288m S  0.0  8.4  21:13.33 java    

可以看到是  5726 ~ 5729這4個線程占用的cpu比較高

3. 將線程的pid 轉成16進制,比如5729 = 0x1661
   到第一步dump出來的 5683.stack 里面找0x1661 就知道是哪個線程了

   "Server-3" prio=10 tid=0x6f1fc000 nid=0x1661 runnable [0x6d67f000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.FileDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
    at sun.nio.ch.IOUtil.write(IOUtil.java:60)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
    - locked <0x77f3b3c0> (a java.lang.Object)
    at java.lang.Thread.run(Thread.java:619)

   經過查找,是服務線程比較忙,初步解決方法,就是加大服務線程數,重啟,問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM