官方文档
github:github地址
中文文档:官方中文文档
常用指令
**基础命令**
help——查看命令帮助信息
cat——打印文件内容,和linux里的cat命令类似
pwd——返回当前的工作目录,和linux命令类似
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键
**jvm相关**
dashboard——当前系统的实时数据面板
thread——查看当前 JVM 的线程堆栈信息
jvm——查看当前 JVM 的信息
sysprop——查看和修改JVM的系统属性
sysenv——查看JVM的环境变量
getstatic——查看类的静态属性
New! ognl——执行ognl表达式
class/classloader相关
sc——查看JVM已加载的类信息
sm——查看已加载类的方法信息
jad——反编译指定已加载类的源码
mc——内存编绎器,内存编绎.java文件为.class文件
redefine——加载外部的.class文件,redefine到JVM里
dump——dump 已加载类的 byte code 到特定目录
classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
**monitor/watch/trace相关**
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。
monitor——方法执行监控
watch——方法执行数据观测
trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
stack——输出当前方法被调用的调用路径
tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
options
options——查看或设置Arthas全局开关
**管道**
Arthas支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep 'index'
grep——搜索满足条件的结果
plaintext——将命令的结果去除ANSI颜色
wc——按行统计输出结果
使用场景
- thread
查看线程使用情况
thread -n 3 # 查看最繁忙的三个线程栈信息
thread # 以直观的方式展现所有的线程情况
thread -b #找出当前阻塞其他线程的线程
- jad 反编译源代码
jad com.alibaba.fastjson.JSON # 直接反编译出java 源代码,包含一些额外信息
- sc 查看JVM已加载的类信息 与 sm 查看已加载类的方法信息
sc com.alibaba.fastjson* # 即可以找到需要的类全路径,如果存在的话
sm com.alibaba.fastjson.JSON parse # 查看某个方法的信息,如果存在的话
sm -d com.alibaba.fastjson.JSON parse 展示每个方法的详细信息
- watch 查看
@ApiOperation(value = "会员登录")
@RequestMapping(value = "/login", method = RequestMethod.POST)
public BaseResponse<LoginResponse> login(@Valid @RequestBody LoginRequest loginRequest)
watch com.*.*.*. login '{params, returnObj, throwExp}' '#cost>200' -e -x 2 # 同时监控入参,返回值,及异常
'#cost>200' (单位是ms)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用
其他特殊用法,请参考 https://github.com/alibaba/arthas/issues/71
复杂的 ognl 语法,请参考: https://alibaba.github.io/arthas/watch.html
- 代码热部署
方法一
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java # 先反编译出class源码
# 然后使用外部工具编辑内容
mc /tmp/UserController.java -d /tmp # 再编译成class
# 最后,重新载入定义的类,就可以实时验证你的猜测了
redefine /tmp/com/example/demo/arthas/user/UserController.class
方法二
使用idea本地编译生成.class文件,上传服务器进行替换,再进行redefine