Jarboot本身是一个启动JAVA进程的工具 , 同时它还附带了一些调试命令 。本文介绍下当Java的服务占用了过高的CPU资源时 , 该如何进行排查 。
如果不借助工具 , 使用linux和jdk自带命令的话 , 步骤是这样的:
- top命令查出占用最高的进程;
- 使用jps -l 或ps -ef|grep java|grep -v grep命令 , 查出是哪个java服务搞的事;
- 使用ps -mp 进程PID -o THREAD,tid,time命令 , 查询具体是进程中哪个线程搞的事 , 命令解释:m表示显示所有的线程 , p表示pid进程使用的cpu时间 , -o是用户自定义的显示格式;
- 将线程ID转换为16进制格式 , 注意是小写 , 比如 , 线程ID为10则转换为a , 必要时可借助计算器进行转换;
- 使用jdk的命令jstack 进程PID | grep tid(第四步转换后的结果) -A60 , 命令解释:-A60为查看结果后的60行;
- 上一步骤会直接打印出线程的执行栈信息 , 可直接定位出具体的哪一行代码出的事 , 到此 , 就可以到我们的业务代码中去检查、解决了 。
了解Jarboot请见:GitHub推荐Java进程启动器—Jarboot
【使用Jarboot排查Java进程CPU占用过高问题】首先使用Jarboot自带的示例程序模拟下CPU占用过高的情况 , 将算法执行次数设的较高 , 间隔设为0 , 这样执行过程会占用很高的CPU 。
文章插图
示例程序
和上面的前两步一样 , 首先查出是哪个Java服务 , 接下来到Jarboot的界面上 , 选中对应的Java进程 。
接下来只需要一条命令 , thread -n 3 , 查看最忙的前3个线程 , 并打印堆栈 , 如下图:
文章插图
查看最忙的前几个线程
相比于不借助工具的更加方便 , 仅需一条命令就可以定位出哪一行 。
如果不是用的Jarboot , 还可以使用淘宝的Arthas工具 , 命令的使用是一样的 。
推荐阅读
- 在谷歌云上自建 K8s 集群并使用 VPC Native 方式实现容器网络互通
- 电脑在使用过程中经常自动重启如何判断和解决
- 分别列举使用手机的好处和坏处各十条 手机的危害以及正确的使用
- 使用 Google Play Points 提升付费留存及用户粘性
- Win10如何使用自带虚拟光驱打开ISO镜像文件?
- 使用方法,薄荷精油的功效作用(附使用方法
- 啤酒花的使用量,长期吃玉竹的副作用
- 如何使用漱口水
- allegro使用技巧 allegro怎么发货
- 宋朝和秦朝哪个朝代可以使用冰块 使用冰块的朝代