Arthas 基础教程

Arthas简介

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。

Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

Github: https://github.com/alibaba/arthas
文档: https://arthas.aliyun.com/doc/
参考:https://alibaba.github.io/arthas/quick-start.html
演示:https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn

Arthas使用

启动arthas-demo

下载arthas-demo.jar,再用java -jar命令启动:

wget https://arthas.aliyun.com/arthas-demo.jar
java -jar arthas-demo.jar

arthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。如果生成的随机数是负数,则会打印提示信息。

启动arthas-boot

在新的Terminal里,下载arthas-boot.jar,再用java -jar命令启动(使用和目标进程一致的用户启动,否则可能attach失败):

wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
  • 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jarsudo -u admin -EH java -jar arthas-boot.jar
  • 如果attach不上目标进程,可以查看~/logs/arthas/目录下的日志
  • 如果下载速度比较慢,可以使用aliyun的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
  • java -jar arthas-boot.jar -h打印更多参数信息

arthas-bootArthas的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程:

$ $ java -jar arthas-boot.jar
* [1]: 35512
  [2]: 71560 arthas-demo.jar

Demo进程是第2个,则输入2,再输入回车/Enter。Arthas会attach到目标进程上,并输出日志:

Attach成功之后,会打印Arthas LOGO。输入help可以获取到更多的帮助信息。

[INFO] Try to attach process 71560
[INFO] Attach process 71560 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki: https://arthas.aliyun.com/doc
version: 3.0.5.20181127201536
pid: 71560
time: 2018-11-28 19:16:24

$

查看Dashboard

dashboard命令可以查看当前系统的实时数据面板。

输入Q或者Ctrl+C可以退出dashboard命令。

$ dashboard
ID     NAME                   GROUP          PRIORI STATE  %CPU    TIME   INTERRU DAEMON
17     pool-2-thread-1        system         5      WAITIN 67      0:0    false   false
27     Timer-for-arthas-dashb system         10     RUNNAB 32      0:0    false   true
11     AsyncAppender-Worker-a system         9      WAITIN 0       0:0    false   true
9      Attach Listener        system         9      RUNNAB 0       0:0    false   true
3      Finalizer              system         8      WAITIN 0       0:0    false   true
2      Reference Handler      system         10     WAITIN 0       0:0    false   true
4      Signal Dispatcher      system         9      RUNNAB 0       0:0    false   true
26     as-command-execute-dae system         10     TIMED_ 0       0:0    false   true
13     job-timeout            system         9      TIMED_ 0       0:0    false   true
1      main                   main           5      TIMED_ 0       0:0    false   false
14     nioEventLoopGroup-2-1  system         10     RUNNAB 0       0:0    false   false
18     nioEventLoopGroup-2-2  system         10     RUNNAB 0       0:0    false   false
23     nioEventLoopGroup-2-3  system         10     RUNNAB 0       0:0    false   false
15     nioEventLoopGroup-3-1  system         10     RUNNAB 0       0:0    false   false
Memory             used   total max    usage GC
heap               32M    155M  1820M  1.77% gc.ps_scavenge.count  4
ps_eden_space      14M    65M   672M   2.21% gc.ps_scavenge.time(m 166
ps_survivor_space  4M     5M    5M           s)
ps_old_gen         12M    85M   1365M  0.91% gc.ps_marksweep.count 0
nonheap            20M    23M   -1           gc.ps_marksweep.time( 0
code_cache         3M     5M    240M   1.32% ms)
Runtime
os.name                Mac OS X
os.version             10.13.4
java.version           1.8.0_162
java.home              /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre

Thread

通过thread命令来获取到arthas-demo进程的Main Classthread 1命令会打印线程ID 1的栈,通常是main函数的线程。

Arthas支持管道,可以用thread 1 | grep 'main('查找到main class

可以看到main classdemo.MathGame

$ thread 1 | grep 'main('
    at demo.MathGame.main(MathGame.java:17)

Sc

可以通过sc命令来查找JVM里已加载的类:

sc -d *MathGame

Jad

可以通过jad命令来反编译代码:

jad demo.MathGame

Watch

通过watch命令可以查看函数的参数/返回值/异常信息。

watch demo.MathGame primeFactors returnObj

输入Q或者Ctrl+C退出watch命令。

$ watch demo.MathGame primeFactors returnObj
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 107 ms.
ts=2018-11-28 19:22:30; [cost=1.715367ms] result=null
ts=2018-11-28 19:22:31; [cost=0.185203ms] result=null
ts=2018-11-28 19:22:32; [cost=19.012416ms] result=@ArrayList[
    @Integer[5],
    @Integer[47],
    @Integer[2675531],
]
ts=2018-11-28 19:22:33; [cost=0.311395ms] result=@ArrayList[
    @Integer[2],
    @Integer[5],
    @Integer[317],
    @Integer[503],
    @Integer[887],
]
ts=2018-11-28 19:22:34; [cost=10.136007ms] result=@ArrayList[
    @Integer[2],
    @Integer[2],
    @Integer[3],
    @Integer[3],
    @Integer[31],
    @Integer[717593],
]
ts=2018-11-28 19:22:35; [cost=29.969732ms] result=@ArrayList[
    @Integer[5],
    @Integer[29],
    @Integer[7651739],
]

Exit/Stop

退出Arthas

exit或者quit命令可以退出Arthas

退出Arthas之后,还可以再次用java -jar arthas-boot.jar来连接。

彻底退出Arthas

exit/quit命令只是退出当前sessionarthas server还在目标进程中运行。

想完全退出Arthas,可以执行stop命令。

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/25/arthas-basic-tutorial/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Arthas 基础教程
Arthas简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 Arthas 支持JDK 6+,支持Li……
<<上一篇
下一篇>>
文章目录
关闭
目 录