1. 利用jdk 命令定位
- 查看java 进程cpu使用率最高的线程,按shift + p 按照cpu 排序,shift +m 按照内存排序
top -Hp 8515
- 把线程ID转为16进制,假设进程 23549 cpu使用率最高
printf "%x\n" 23549
5bfd
- 查看堆栈信息
jstack 23496 |grep 5bfd -A 30
2. arthas 定位JVM 问题、
- arthas介绍
Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动不全,可以方便的定位和诊断线上程序运行问题。截至本篇文章编写时,已经收获 Star 17000+。
Arthas 官方文档十分详细,本文也参考了官方文档内容,同时在开源在的 Github 的项目里的 Issues 里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。
- arthas 应用场景
得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。是否有一个全局视角来查看系统的运行状况?为什么 CPU 又升高了,到底是哪里占用了 CPU ?运行的多线程有死锁吗?有阻塞吗?程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?有什么办法可以监控到 JVM 的实时运行状态?
- 安装运行
# github下载
wget https://alibaba.github.io/arthas/arthas-boot.jar
# 或者 Gitee 下载
wget https://arthas.gitee.io/arthas-boot.jar
# 打印帮助信息
java -jar arthas-boot.jar -h
# 运行方式
sh as.sh
#或者
java -jar arthas-boot.jar
- 常用命令介绍
- 官方文档
开源地址:https://github.com/alibaba/arthas
官方文档:https://alibaba.github.io/arthas
3. 分享一个开源小工具定位
- shell脚本下载地址:
wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release-2.x.zip
unzip release-2.x.zip
- 使用方式,进入bin目录下执行
./show-busy-java-threads
- 常用命令如下
#从所有JAVA线程找出最消耗CPU的线程,默认5个
show-busy-java-threads.sh
show-busy-java-threads.sh -c <要显示的线程栈数>
show-busy-java-threads.sh -c <要显示的线程栈数> -p <指定的JAVA process>
show-busy-java-threads.sh -a <输出记录到文件>
show-busy-java-threads.sh -t <重复执行的次数> -i <重复执行的间隔秒数>