如何定位cpu占用率高的java线程

  • 查看cup的使用情况,在Linux下可以使用 top 或者 htop命令
top -u ${用户} -c 
top -u devops -c 
  • 在命令行提示符执行top命令,输入大写P,则结果按CPU占用降序排序。输入大写M,结果按内存占用降序排序。大写T按运行时间排序。(注:大写P可以在capslock状态输入p,或者按Shift+p)。
  • 具体的可以参考:
http://www.169it.com/it-linux/article-linux%E4%B8%8Btop%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3-virt-res-shr-%E6%8E%92%E5%BA%8F-6549555377111610135

这里写图片描述

  • 查看jvm的进程ID,可以通过jps或者ps
jps -lvm
ps -ef | grep Test

这里写图片描述

  • 找出该进程内最耗费CPU的线程
top -Hp 2444
  • 也可以根据大写P来调整排序

这里写图片描述

  • 将线程ID转化为16进制
printf "%x\n"  线程ID
eg. printf "%x\n" 2459

这里写图片描述

  • 通过jstack输出进程(2444)的堆栈信息,然后根据16进制的线程ID过滤结果
jstack 2444 | grep 99b
  • 也可以先将堆栈信息输出通过grep命令过滤定位
jstack 2444 >stack.txt
  • 这样就定位到了具体引起cup高的代码位置了(下图:Test.java类的第7行)

这里写图片描述

  • 命令参考
grep "99b" stack.txt -A 25
grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行
grep -B 5 foo file 显示foo及前5行
grep -A 5 foo file 显示foo及后5

这里写图片描述

  • 对线程状态进行分析。线程状态如下所示:
1)  死锁,Deadlock(重点关注)
2)  执行中,Runnable  
3)  等待资源,Waiting on condition(重点关注,等待什么资源)
4)  等待获取监视器,Waiting on monitor entry(重点关注)
5)  暂停,Suspended
6)  对象等待中,Object.wait() 或 TIMED_WAITING
7)  阻塞,Blocked(重点关注) 
8)  停止,Parked

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lsziri/article/details/78179716
今日推荐