找到最耗CPU的java線程

(1) 使用top命令找出佔用cpu最高的JAVA進程
top -c

PID USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND         
6965 root      20   0    57.3g  27g 1.0g S 303.5 58.4   3243:41 /usr/local/...
23853 root    20   0   1614m 1.1g  15m S  4.6  2.4    4363:17 java...  
22384 guest 15   0 12740 1164  820 R  0.3  0.0    0:00.08  top -c 
2 root      RT  -5     0    0    0 S  0.0  0.0    0:21.97  [migration/0]  

PID:6965


(2) 找出佔用cpu最高的線程 
top -Hp 6965 -d 1 -n 1

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16392 root      16   0 57.4g  27g 1.0g R 55.3 58.4   0:30.98 java
8757 root      25   0 57.4g  27g 1.0g R 53.6 58.4 103:54.27 java  
top命令參數說明:
-p PID 僅監視指定進程的ID,PID是一個數值;
-c 顯示命令行,而不僅僅是命令名
-h 當系統由多個CPU時,個別CPU的狀態信息被隱藏,只顯示平均狀態值
-d N  顯示兩次刷新時間的間隔,比如 -d 5,表示兩次刷新間隔爲5秒;

(3) 打印佔CPU最高JAVA進程6965的堆棧信息 
jstack 6965 > /root/mss/dump.txt

(4) 佔CPU最高線程16392換算成16進制到文檔中尋找對應線程4008
用命令
printf "%x\n" 16392 
可查到對應的16進制線程id:4008
"Reference Handler" daemon prio=10 tid=0x27ed0400 nid=0x1f1c in Object.wait() [0
x281ff000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
        - locked <0x0e6a5188> (a java.lang.ref.Reference$Lock)

參考文章:

http://lxiaodao.iteye.com/blog/1413774 

發佈了125 篇原創文章 · 獲贊 39 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章