转:java如何定位cpu占用较高
流程:把线程dump出来,然后分析
1:Threaddump的方法:
kill -3 pid
jstack -l pid
jvisualvm中来thread dump
2:找到导致cpu高的线程
top -H -p pid
? PID USER????? PR? NI? VIRT? RES? SHR S %CPU %MEM??? TIME+? COMMAND????????????????????????????????????????????????????????????
?4691 root????? 19?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:00.01 java???????????????????????????????????????????????????????????????
?4692 root????? 19?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:00.39 java???????????????????????????????????????????????????????????????
?4698 root????? 15?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:14.14 java???????????????????????????????????????????????????????????????
?4699 root????? 15?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:00.43 java???????????????????????????????????????????????????????????????
?4700 root????? 15?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:00.63 java???????????????????????????????????????????????????????????????
?4701 root????? 18?? 0? 448m 132m? 13m S? 0.0? 7.5?? 0:00.00 java??????????????????????????????????????????????????????????????
?对应的线程id是十进制的,需要转换为十六进制的在threaddump文件中才可以看到
3:十进制转十六进制
-bash-3.2# python
>>> print hex(4739)
0×1283
4:找到对应的线程
vi threaddump.log
查找:/0×1283
找到对应的线程,把相关的方法找出来,可以精确到代码的行号,自己修改相关源码来fix bug。