show-busy-java-threads查找CPU占用高

Posted 21aspnet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了show-busy-java-threads查找CPU占用高相关的知识,希望对你有一定的参考价值。

背景:需要查找线上CPU占用过高的Java线程在做什么。

可以使用top命令找出占CPU高的进程

#top 然后按shift+C 按CPU占比排序

然后把进程中占比高的线程id找出来,这个是常见的套路,但是这样做比较繁琐。

可以使用show-busy-java-threads工具包快速定位,确实好用。

1.下载安装

下载

#wget https://github.com/oldratlee/useful-scripts/archive/release.zip

解压

#unzip useful-scripts-release.zip

这是介绍:useful-scripts/java.md at master · oldratlee/useful-scripts · GitHub 

show-busy-java-threads
# 从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈

# 缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便
# 当然你可以手动指定要分析的Java进程Id,以保证只会显示你关心的那个Java进程的信息
show-busy-java-threads -p <指定的Java进程Id>

show-busy-java-threads -c <要显示的线程栈数>

show-busy-java-threads <重复执行的间隔秒数> [<重复执行的次数>]
# 多次执行;这2个参数的使用方式类似vmstat命令

show-busy-java-threads -a <运行输出的记录到的文件>
# 记录到文件以方便回溯查看

show-busy-java-threads -S <存储jstack输出文件的目录>
# 指定jstack输出文件的存储目录,方便记录以后续分析

##############################
# 注意:
##############################
# 如果Java进程的用户 与 执行脚本的当前用户 不同,则jstack不了这个Java进程
# 为了能切换到Java进程的用户,需要加sudo来执行,即可以解决:
sudo show-busy-java-threads

show-busy-java-threads -s <指定jstack命令的全路径>
# 对于sudo方式的运行,JAVA_HOME环境变量不能传递给root,
# 而root用户往往没有配置JAVA_HOME且不方便配置,
# 显式指定jstack命令的路径就反而显得更方便了

# -m选项:执行jstack命令时加上-m选项,显示上Native的栈帧,一般应用排查不需要使用
show-busy-java-threads -m
# -F选项:执行jstack命令时加上 -F 选项(如果直接jstack无响应时,用于强制jstack),一般情况不需要使用
show-busy-java-threads -F
# -l选项:执行jstack命令时加上 -l 选项,显示上更多相关锁的信息,一般情况不需要使用
# 注意:和 -m -F 选项一起使用时,可能会大大增加jstack操作的耗时
show-busy-java-threads -l

# 帮助信息
$ show-busy-java-threads -h

2.使用

#./show-busy-java-threads

 

参考:JVM那点事—show-busy-java-threads排查CPU性能问题 - 简书

以上是关于show-busy-java-threads查找CPU占用高的主要内容,如果未能解决你的问题,请参考以下文章

Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战

Java相关脚本-排查最消耗CPU的线程Jar冲突

Java相关脚本

c语言编程实现“折半查找”的过程。

C语言顺序查找程序

c语言查找整数?