传统的方法
【top】
查看所有进程占系统CPU的排序,定位是哪个进程搞的鬼。PID那一列就是进程号。
【top -Hp pid】
定位进程中使用 CPU 最高的线程tid
【printf ‘0x%x’ tid】
线程 tid 转化 16 进制,例如printf ‘0x%x’ 11882 得到16进制的 0x2e6a
【jstack pid | grep tid 】找到线程堆栈,例如jstack 11763 | grep 0x2e6a -A 30
查问题时,会要多次上面的操作以分析确定问题,这个过程太繁琐太慢了。
期望整合上面的过程成一个脚本,这样一行命令就可以自动化地搞定。
脚本方法
【wget --no-check-certificate https://gitee.com/fightx/useful-scripts/raw/dev-2.x/bin/show-busy-java-threads】
这条命令使用
wget
工具从gitee下载一个名为show-busy-java-threads
的脚本文件。--no-check-certificate
选项表示不检查SSL证书的有效性,这在某些情况下可能是必要的,但通常不推荐使用,因为它可能会导致安全风险。【head -n 10 show-busy-java-threads】
检查下载下来的内容是否是脚本
【chmod +x show-busy-java-threads】
这条命令使用
chmod
工具赋予刚刚下载的show-busy-java-threads
脚本可执行权限,使得它可以在命令行中直接运行。【./show-busy-java-threads】
这条命令执行刚刚下载并赋予可执行权限的
show-busy-java-threads
脚本。这个脚本的作用是查找并显示系统中正在运行的Java进程中占用CPU资源最多的前5个线程。分析步骤
识别高CPU消耗线程:
查看输出中每个线程的CPU占用百分比(例如,
Busy(98.2%)
)。高CPU消耗的线程通常是性能瓶颈的潜在来源。
查看线程ID和名称:
每个线程都有一个线程ID(例如,
29385
)和名称(例如,"main"
)。这些信息有助于你识别具体的线程。
分析线程状态:
查看线程状态(例如,
RUNNABLE
、TIMED_WAITING
)。
RUNNABLE
状态表示线程正在运行或准备运行,而TIMED_WAITING
状态表示线程在等待某个条件。检查线程堆栈:
查看线程堆栈跟踪(例如,
at com.example.MyClass.busyMethod(MyClass.java:42)
)。堆栈跟踪显示了线程当前执行的方法和代码行,有助于定位问题代码。
定位问题代码:
根据堆栈跟踪信息,找到具体的Java类和方法。
检查这些方法的实现,看看是否有优化的空间或潜在的性能问题。
更多用法参照:docs/java.md · fightx/useful-scripts - Gitee.com
阿里开源方法
【curl -O https://arthas.aliyun.com/arthas-boot.jar】
下载jar包
【java -jar arthas-boot.jar】
启用
在启动Arthas时,它会列出当前系统中正在运行的Java进程,并要求你选择一个进程进行监控。你需要输入进程的序列号(例如,输入
1
选择第一个进程),然后按回车键。【thread -n 5】
进一步分析【thread id】
如果你发现某些线程的CPU使用率异常高,可以进一步分析这些线程的堆栈跟踪,以确定具体的性能瓶颈。例如,你可以使用以下命令来查看特定线程的堆栈跟踪:
其他命令参考官网:arthas: Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具
点赞收藏加关注
下一期创作内容:通过上述步骤,找出有问题的代码之后,观察到线程栈之后。怎么根据具体问题来具体分析。