目录
一、场景
linux下使用top命令发现cpu占用高的java项目及进程id
二、案例代码
编写死循环代码
启动脚本start.sh
在启动脚本中加入了JMX的端口是9998
二、检查诊断
1、查看java线程使用资源情况
top -Hp pid
top -Hp 8622
8622是进程id
我们发现当前有5条线程的cpu占用很高
2、定位代码
方法1、使用linux命令
1)、找到对应的线程之后,比如是8688占用高,则通过命令转换16进制
printf '%x' 8688
# 得到
21f0
2)、用jstack保存现场
jstack 8688 > /tmp/8688.txt
3)、vim打开8688.txt
# 用斜杆/搜索21f0
最终定位到我们自己的代码
扫描二维码关注公众号,回复: 14139377 查看本文章
方法2、使用JDK可视化工具jvisualvm工具定位代码
找到工具
在jdk的安装路径中找到该工具,例如:D:\Program Files\Java\jdk1.8.0_151\bin
连接jmx
在java程序的start.sh中已经配置了jmx,且端口是9998
切换到线程页面,发现了我们自己写的线程
通过线程Dump分析线程及定位代码行
将上述Dump信息拷贝到文本,用文本编辑器打开搜索我们自己的包名
代码已经定位到DeadLoopController.java的第59行
特别感谢参考:https://www.ixigua.com/6842644783408611851?id=6842129797049483780&logTag=b175c62ffa380a3617ea