目录
Arthas 介绍什么是Arthas,它能为我们做什么Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
Arthas 介绍
什么是Arthas,它能为我们做什么
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
Arthas相关地址
基础教程
启动arthas-boot
下载arthas-boot.jar或者下载后上传到服务器
linux 下载命令
wget https://alibaba.github.io/arthas/arthas-boot.jar
jar包(阿里网盘)
https://www.aliyundrive.com/s/PeKS4aoqqgm
再用java -jar
命令启动(以下命令不区分系统)
java -jar arthas-boot.jar --target-ip 0.0.0.0
arthas-boot
是Arthas
的启动程序,它启动后,会列出所有的Java进程。
选择需要诊断的目标进程,再Enter/回车
,Attach成功之后,会打印Arthas LOGO。
常用命令
Dashboard
dashboard
命令可以查看当前系统的实时数据面板。
输入 Q
或者 Ctrl+C
可以退出dashboard命令。
thread
thread
命令会打印线程的栈。
Arthas支持管道,可以用 thread 23 | grep run
查找到run class
。
sc
可以通过 sc
命令来查找JVM里已加载的类:
sc -d 类名
sc -d *.EurekaApplication
如果搜索的是接口,还会搜索所有的实现类。比如查看所有的Filter
实现类:
sc javax.servlet.Filter
通过-d
参数,可以打印出类加载的具体信息,很方便查找类加载问题。
sc -d javax.servlet.Filter
sc
支持通配,比如搜索所有的StringUtils
sm
sm
命令则是查找类的具体方法或者函数。
sm java.math.RoundingMode
sm com.wzg.api.controller.MemberController
支持使用通配符
sm *.MemberController
通过-d
参数可以打印函数的具体属性
sm -d *.MemberController
jad
可以通过 jad
命令来反编译代码
jad 路径
jad com.shentantech.traffic.eureka.EurekaApplication
通过--source-only
参数可以只打印出在反编译的源代码
jad --source-only com.shentantech.traffic.eureka.EurekaApplication
watch
通过watch
命令可以查看函数的参数/返回值/异常信息。
查看参数
watch com.wzg.api.controller.MemberController getMemberNameByparam param
查看返回值
watch com.wzg.api.controller.MemberController getMemberNameByparam returnObj
- 第一个参数是类名,支持通配
- 第二个参数是函数名,支持通配
-
返回值表达式
在上面的例子里,第三个参数是返回值表达式,它实际上是一个ognl表达式,它支持一些内置对象:loader
clazz
method
target
params
returnObj
throwExp
isBefore
isThrow
isReturn
你可以利用这些内置对象来组成不同的表达式。比如返回一个数组
watch *.MemberController * '{params,returnObj}'
更多参考: https://alibaba.github.io/arthas/advice-class.html
watch
命令支持在第4个参数里写条件表达式,比如
watch *.MemberController * returnObj 'params[0]> 12'
当异常时捕获
watch
命令支持-e
选项,表示只捕获抛出异常时的请求
watch
命令支持按请求耗时进行过滤
watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'
输入 Q
或者 Ctrl+C
退出watch命令。
Exit/Shutdown
-
退出Arthas
用 exit 或者 quit 命令可以退出Arthas。
退出Arthas之后,还可以再次用 java -jar arthas-boot.jar 来连接。
- 彻底退出Arthas
exit/quit命令只是退出当前session,arthas server还在目标进程中运行。
想完全退出Arthas,可以执行 shutdown 命令。
进阶教程
常用命令
查看JVM信息
sysprop
- 可以通过
sysprop
打印所有的System Properties信息
sysprop
- 也可以指定单个key:
sysprop java.version
- 也可以通过
grep
来过滤:
sysprop |grep java
- 可以设置新的value:
sysprop key value
例如:
sysprop testKey testValue
sysenv
可以sysenv
命令获取到环境变量。和sysprop
命令类似。
sysenv
jvm
jvm
命令会打印出JVM
的各种详细信息。
使用技巧
自动补全
Arthas支持丰富的自动补全功能,在使用有疑惑时,可以输入Tab
来获取更多信息。
比如输入 sysprop java.
之后,再输入Tab
,会补全出对应的key:
readline的快捷键支持
Arthas支持常见的命令行快捷键,比如Ctrl + A
跳转行首,Ctrl + E
跳转行尾。
更多的快捷键可以用 keymap
命令查看。
历史命令的补全
如果想再执行之前的命令,可以在输入一半时,按Up/↑ 或者 Ddown/↓,来匹配到之前的命令。
比如之前执行过sysprop java.version,那么在输入sysprop ja之后,可以输入Up/↑,就会自动补全为sysprop java.version。
如果想查看所有的历史命令,也可以通过 history 命令查看到。