找到最耗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 

你可能感兴趣的:(性能优化)