Arthas是Alibaba开源的一款Java诊断工具,其提供了丰富的命令。这里介绍其中的thread、jad、sc、sm、ognl命令
thread命令
命令参数
该命令可以查看线程相关信息。该命令常用地选项有:
- —all :显示所有匹配的线程
- -i <num> :设置cpu统计时的采样间隔,单位为毫秒
- <id> :查看指定ID的线程堆栈
- -n <num> :查看CPU使用率最高的TopK个线程。如果值为-1表示显示所有线程
- -b :发现阻塞其他线程的持锁线程
实践
下述代码模拟CPU飙升
1 | public class TestThread { |
可以看出ID为1、线程名为main的线程大量消耗CPU
然后通过指定线程ID查看线程堆栈信息,即可辅助我们定位到代码
下述通过创建线程模拟多个线程繁忙的现象
1 | public class TestThread { |
查看CPU使用率的Top K个线程,效果如下所示
下述代码模拟了A线程持有锁,同时阻塞了B线程的场景
1 | public class TestThread { |
通过thread命令不难看出,A线程运行、B线程被阻塞。进一步通过指定线程ID来查看B线程的堆栈信息,可以看出其欲获取的锁信息、持锁线程信息;而通过-b选项我们则可以直接看出持锁线程A阻塞了其他线程
jad命令
其可以对指定已加载类进行反编译,该命令常用地选项有:
- —lineNumber [true/false] :是否显示代码行号, 默认为true
- —source-only :默认反编译结果会包含ClassLoader信息、源码。使用该选项后,将会只展示源码
这里提供如下的测试代码
1 | package com.aaron.Arthas; |
查看TestJad类的反编译结果
1 | jad com.aaron.Arthas.TestJad |
查看TestJad类的反编译结果,不显示源码行号。输出结果不包含ClassLoader信息。
1 | jad --lineNumber false --source-only com.aaron.Arthas.TestJad |
此外还可以在类名后面添加方法名来查看该类中指定方法的反编译结果
sc
该命令查看JVM已加载的类信息,测试代码如下
1 | package com.aaron.Arthas; |
查看类的详细信息
1 | sc -d com.aaron.Arthas.Person |
查看类的详细信息,包含字段信息
1 | sc -d -f com.aaron.Arthas.Person |
sm
该命令查看JVM已加载类的方法信息,测试代码如下
1 | package com.aaron.Arthas; |
查看该类下所有方法,注意不包含父类的方法
1 | # 查看类下的方法信息 |
查看类中方法的详细信息
1 | # 查看类下的方法信息 |
查看类中指定方法的详细信息
1 | # 查看类中getPersons方法的详细信息 |
ognl
Arthas中提供了对ognl表达式的支持,测试代码如下所示
1 | package com.aaron.Arthas; |
查看静态变量
1 | # 查看该类下的静态变量 |
调用类的静态方法
1 | # 调用类的无参静态方法 |
查看集合中元素
对于List、Map而言, 可分别通过指定索引、键名的方式来查看集合中的元素
1 | # 查看List中下标索引为2的元素 |
调用对象的方法
对于对象而言,类似于Java语法一样可通过点语法进行方法调用
1 | # 调用类的无参方法 |