这是一款阿里巴巴开源的 Java 工具,用来对运行中
的程序进行实时诊断。简单用了下,马上路转粉了
安装很简单
Windows 平台,下载这个 jar 包
https://alibaba.github.io/arthas/arthas-boot.jar
非 Windows 平台一键安装
$ curl -L https://alibaba.github.io/arthas/install.sh | sh
想测试 Arthas,下载这个测试程序
https://alibaba.github.io/arthas/arthas-demo.jar
运行它
$ java -jar arthas-demo.jar
再运行 Arthas
$ java -jar arthas-boot.jar
自动把当前运行中的 Java Process 输出到控制台
$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 67445 org.jetbrains.jps.cmdline.Launcher
[2]: 79685 arthas-demo.jar
[3]: 19911
[4]: 50879 org.jetbrains.jps.cmdline.Launcher
看到输出中前面标注的序号,想要 attach 到某个进程上,直接输入序号并回车(第一次执行时会下载一些依赖包),如果成功,基本上就显示如下信息
[INFO] Try to attach process 79685
[INFO] Attach process 79685 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version 3.1.7
pid 79685
time 2020-03-31 22:12:05
[arthas@79685]$
接下来就可以使用 Arthas 提供的命令,对这个进程进行摸排了
thread 命令
打印这个进程的线程信息
做的是相当用心,居然还上了色
想看看某个线程这会儿在干嘛,比如主线程 main,输入第一列它对应的 ID 号,比如 1, thread 1
,就会输出 main 此时的调用栈
[arthas@79685]$ thread 1
"main" Id=1 TIMED_WAITING
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at demo.MathGame.main(MathGame.java:17)
jad 命令
这个厉害了,直接反编译代码输出。将程序中想要反编译的全限定类名跟在命令后
[arthas@79685]$ jad demo.MathGame
watch 命令
实时监控指定方法的数据,比如返回值,入参,抛出的异常
这里查看方法 primeFactors
的返回值
[arthas@79685]$ watch demo.MathGame primeFactors returnObj
左框是监控结果,右框是控制台输出的打印
监控方法调用前,调用后的参数和返回值情况:
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b -s -n 2
-n 表示监控的次数,这里填 2,表示一次调用前和一次调用后就结束监控
监控调用耗时过长的情况(以下示例只输出方法中耗时超过 100ms 的):
[arthas@79685]$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>100' -x 2
热更新代码
这个更厉害了,将代码实时更新到运行中
的程序
为方便实验,我先导出测试程序中的代码
[arthas@79685]$ jad --source-only demo.MathGame > /Users/mac/MathGame.java
将 MathGame.java 中 print 方法添加一行打印信息 System.out.println("print method in");
- mc 命令编译 java 为 class
-d 命令指定 class 文件存放的目录
$[arthas@79685] mc /Users/mac/MathGame.java -d /Users/mac/
成功的信息
Memory compiler output:
/Users/mac/demo/MathGame.class
Affect(row-cnt:1) cost in 110 ms.
- 热更新
[arthas@79685]$ redefine /Users/mac/demo/MathGame.class
redefine success, size: 1
测试程序将添加的信息输出了
但有两个限制
- 不允许新增加 field 或 method
- 正在跑的方法,没有退出不能生效
stop 命令
正常断开与进程的连接
总结
初次接触这款工具,就发现很多非常实用的功能,查看线程状态
,反编译实时源码
,监控方法参数和返回值,异常
,热更新代码
,对日常调试 Java 程序带来相当大的帮助,这里仅仅列举了它的一小部分功能,更多功能可访问
https://alibaba.github.io/arthas/ 获得