简介
Arthas 是Alibaba开源的Java诊断工具.
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断.
为什么需要Arthas,它能做些什么?
1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
3.线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
4.是否有一个全局视角来查看系统的运行状况?
5.有什么办法可以监控到JVM的实时运行状态?
6.如果系统CPU占用突然暴涨,怎么快速定位问题?
官方文档
https://alibaba.github.io/arthas/index.html
启动Arthas
下载jar包:wget https://alibaba.github.io/arthas/arthas-boot.jar
启动: java -jar arthas-boot.jar
Arthas命令
注意事项、小技巧
help可以查看所有命令名称及描述
Arthas里每一个命令都有详细的帮助信息。可以用-h来查看。帮助信息里有EXAMPLES和WIKI链接。
可以通过
history
查看所有的历史命令
查看当前系统的整体状况:
dashboard 命令可以查看当前系统的实时数据面板。
sysprop 可以打印所有的系统属性信息
sysenv 命令可以获取到环境变量。和sysprop命令类似。
jvm 命令会打印出JVM的各种详细信息
classloader 用来查看当前所有的类加载器,-c 指定加载器hash
热更新一条龙:
jad 反编译代码,类或者方法 可用 > ,输出java文件,例如jad –-source-only > 文件路径/文件名.java,不加—source-only会带有类加载器信息不能编译成功.
mc 用来编译代码,指定java文件路径进行编译,实验的执行成功率很低
redefine 重新加载新编译好的class,指定class文件路径,成功率比较高一点,所以实际用时可以先用编辑器编译成class再用此命令加载到程序中
上帝模式,随便看:
thread 1 命令会打印线程ID 1的栈,不加1可打印出所有的线程,支持通道:thread | grep main
sc 查找JVM里已加载的类
sm 查找类的具体函数
monitor 对方法进行监控,输出每段时间的调用情况统计
trace 用于跟踪某个方法被调用,以及之后调用了哪些方法
stack 用于查看某个方法的调用栈
watch 命令可以查看函数的参数/返回值/异常信息等,watch 的第3个参数为返回值表达式,可以写Arthas中的内置对象,以下表格列出所有对象的不同含义:
watch/stack/trace这个三个命令都支持
#cost
筛选时间ognl 可以动态执行代码,例如
ognl '@java.lang.System@out.println("hello ognl")'
OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71退出Arthas
exit 或者 quit 命令可以退出当前session,arthas server还在目标进程中运行。
shutdown 可以完全退出Arthas