Arthas 阿里诊断工具快速诊断java线上问题
参考资料(官网): https://arthas.gitee.io/index.html
参考资料(阿里云官方CSDN): Arthas 使用的四种方式
参考资料: 使用Arthas五分钟解决一个问题
1. 安装
下载并启动:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
如果下载慢,可以使用阿里云镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
启动后可以选择应用java进程:
$ java -jar arthas-boot.jar
* [1]: 35542
[2]: 71560 math-game.jar
2 #math-game进程是第2个,则输入2,再输入回车/enter。Arthas会attach到目标进程上,并输出日志
进入进程后,也可以通过 Arthas Console 自有的控制台: http://localhost:8563/
或者在 arthas-boot 启动前,使用 jps
命令可以快速查看当前启动的 java 进程PID和进程名称:
$ jps
12064 jar
14016 Launcher
17136 AppletMockApplication
16316 Jps
22748
全局命令说明:
- -x 是展示结果属性遍历深度,默认为 1
- -n 是执行的次数 ,q 退出
- -c classloader 的hash值
- 退出 q ,关闭 stop
2. 快速诊断
2.1 快速诊断流程
一、定位相关方法
二、生成观测方法命令:
arthas idea
插件,在方法上右键,Arthas Command
-Watch
或Trace
三、登陆应用服务器
四、curl 或拷贝 jar 包安装 Arthas
五、运行 Arthas
六、执行观测方法命令
七、查看观测结果
dashboard
查看当前进程的实时面板数据。
https://arthas.gitee.io/dashboard.html
dashboard
thread
查看当前线程信息,查看线程的堆栈
https://arthas.gitee.io/thread.html
thread 1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)
jad
反编译指定已加载类的源码,查看代码是否是最新的。
https://arthas.gitee.io/jad.html
jad com.xxx.service.impl.XxxImpl [方法名]
★ watch
可以查看入参、返回值、异常、可以执行表达式获取静态变量、target.xxx调用目标实施的字段、方法等等,只要你想得到没有做不到的。
https://arthas.gitee.io/watch.html
watch com.xxx.service.impl.XxxImpl 方法名 '{params,returnObj,throwExp}' -n 5 -x 3
- params 参数
- returnObj 返回值
- throwExp 异常
- -n 5 表示只执行5次
- -x 3 表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1
★ trace
方法内部调用路径,并输出方法路径上的每个节点上耗时 —— 定位代码中执行慢的逻辑,性能优化!
https://arthas.gitee.io/trace.html
#简单用法:跟踪调用路径和耗时
trace demo.MathGame run
#只会展示耗时大于100ms的调用路径,有助于在排查问题的时候,只关注异常情况
trace demo.MathGame run '#cost > 100'
#可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。
trace -E com.xxx.service.impl.XxxImpl 方法名 -n 5 --skipJDKMethod false '1==1'
- 没有被trace到的函数。比如java.* 下的函数调用默认会忽略掉。通过增加–skipJDKMethod false参数可以打印出来。
3. 高级命令
进阶使用 — Arthas 3.5.5 文档 (gitee.io)
命令列表 — Arthas 3.5.5 文档 (gitee.io)
4. IDEA 插件
arthas idea
安装了“arthas idea”插件之后,在方法名上面单击右键,选择watch,就生成方法观测命令在粘贴板中: