Arthas 是Alibaba开源的Java诊断工具。
准备工作
- 准备arthas
先在进入文档下载arthas的jar包:如图
下载好后解压,重点关注arthas-boot.jar的这个jar - 准备测试代码
此程序为随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。
public class RandomNumber {
private static Random random = new Random();
private int illegalArgumentCount = 0;
public static void main(String[] args) throws InterruptedException {
RandomNumber game = new RandomNumber();
while (true) {
game.run();
TimeUnit.SECONDS.sleep(1L);
}
}
public void run() throws InterruptedException {
try {
int number = random.nextInt() / 10000;
List<Integer> primeFactors = this.primeFactors(number);
RandomNumber.print(number, primeFactors);
} catch (Exception e) {
System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
}
}
public static void print(int number, List<Integer> primeFactors) {
StringBuffer sb = new StringBuffer(number + "=");
for (int factor : primeFactors) {
sb.append(factor).append('*');
}
if (sb.charAt(sb.length() - 1) == '*') {
sb.deleteCharAt(sb.length() - 1);
}
System.out.println(sb);
}
public List<Integer> primeFactors(int number) {
if (number < 2) {
++this.illegalArgumentCount;
throw new IllegalArgumentException("number is: " + number + ", need >= 2");
}
ArrayList<Integer> result = new ArrayList<Integer>();
int i = 2;
while (i <= number) {
if (number % i == 0) {
result.add(i);
number /= i;
i = 2;
continue;
}
++i;
}
return result;
}
}
启动Arthas
-
先启动准备好的测试程序
-
然后启动arthas-boot.jar,直接cmd中使用java -jar arthas-boot.jar启动
-
启动后如图所示:输入刚才启动的测试程序序号:3,然后回车,如有arthas的logo则启动成功.
执行命令
注:可通过help进行命令查询,可Tab自动补全,兼容部分Linux命令
- dashboard 查看当前系统的实时数据面板。输入Q或Ctrl+C可退出dashboard命令
- thread 1 打印线程ID为1的栈 ,Arthas支持管道可使用如:thread 1 | grep ‘main(’ 进行查找
可看到main class的路径为com.any.arthas.RandomNumber中 - sc 查找JVM已加载的类 如:sc -d *RandomNumber
- jad 通过这个命令可进行反编译代码 如:jad com.any.arthas.RandomNumber
- watch 通过这个命令可以查看方法的参数/返回值/异常现象。如:watch com.any.arthas.RandomNumber 方法名 returnObj 输入Q或Ctrl+可退出
- 退出Arthas与彻底退出Arthas
退出:使用exit 或者 quit 命令可退出Arthas。退出后还可以再次运行arthas-boot.jar包进行连接。
彻底退出:exit和quit命令只是退出当前session,arthas server还在目标进程中运行。想要完全退出Arthas则需要执行stop命令。
如果没有使用stop命令退出而再次选择其他进程连接则会报错。
详细报错信息可自行尝试,或者看我之前发的博客:Arthas [ERROR] The telnet port 3658 is used by process
Arthas的使用在windows下与linux下使用arthas差别并不大。
基础教程就到这里,更多命令可自行查看文档。