生产环境下,如果出现此类问题时,可通过线程的堆栈,查找、定位问题所在。
提供如下三种办法:
一、通过top和jstack
--查看某个进程的情况:cpu、内存等
top -p 26162
--查看linux中某个进程内部的线程情况
top -H -b -n 1 -p 26162 | head -n 100
命令解释:
top命令:
-p :进程号
-b :以批次的方式执行top
-n :与-b配合使用,表示需要进行几次top命令的输出结果
-H :查看进程的内部的线程情况
head命令:
-n 取前几行
jstack命令: 查看当前线程的代码堆栈
-F:Force a stack dump when 'jstack [-l] pid' does not respond.
-l:Long listing. Prints additional information about locks such as list of owned java.util.concurrent ownable synchronizers.
-m:prints mixed mode (both Java and native C/C++ frames) stack trace.
-h:prints a help message.
top命令中的pid和jstack中的nid的关系
1、pid是10进制的
2、nid是16进制的
二、通过arthas
官网:https://arthas.aliyun.com/doc/idea-plugin.html
arthas的功能很强大,具体可以查看官网。
解决cpu、死锁之类的问题时,以下命令比较常用
dashboard命令(dashboard 1)
thread命令(thread -n 10)
三、通过show-busy-java-threads
下载地址:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads
切换到:/opt/abc/useful-scripts-release-2.x/bin
执行命令:./show-busy-java-threads
四、优缺点比较
1、top和jstack ,linux和java的自带命令,不需要额外安装;操作稍微复杂
2、arthas 需要单独启动一个服务;需要熟悉arthas的命令
3、show-busy-java-threads 单独上传一个脚本即可,操作比较简单,是top和jstack的封装