Arthas,Java 应用实时诊断监控神器

这是一款阿里巴巴开源的 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");

  1. 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.
  1. 热更新
[arthas@79685]$ redefine /Users/mac/demo/MathGame.class
redefine success, size: 1

测试程序将添加的信息输出了

但有两个限制

  • 不允许新增加 field 或 method
  • 正在跑的方法,没有退出不能生效

stop 命令

正常断开与进程的连接

总结

初次接触这款工具,就发现很多非常实用的功能,查看线程状态反编译实时源码监控方法参数和返回值,异常热更新代码,对日常调试 Java 程序带来相当大的帮助,这里仅仅列举了它的一小部分功能,更多功能可访问
https://alibaba.github.io/arthas/ 获得

发布了27 篇原创文章 · 获赞 3 · 访问量 5653

猜你喜欢

转载自blog.csdn.net/candyngwh/article/details/105235761