官方文档:https://arthas.aliyun.com/doc/commands.html
安装方式
-
从阿里云下载jar包
curl ‐O https://arthas.aliyun.com/arthas‐boot.jar
-
github下载
wget https://alibaba.github.io/arthas/arthas‐boot.jar
-
Gitee 下载
wget https://arthas.gitee.io/arthas‐boot.jar
-
打印帮助信息
java ‐jar arthas‐boot.jar ‐h
运行
1.netstat -nap|grep port 或 Jps
2.java ‐jar arthas‐boot.jar [PID]
命令生成插件
- idea安装“arthas idea”插件
- 方法名单击右键,选择命令,示例如下图:
常用命令
dashboard 当前系统的实时数据面板
thread 查看当前 JVM 的线程堆栈信息
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
monitor 方法执行监控
jvm 查看当前 JVM 信息
vmoption 查看,更新 JVM 诊断相关的参数
sc 查看 JVM 已加载的类信息
sm 查看已加载类的方法信息
jad 反编译指定已加载类的源码
classloader 查看 classloader 的继承树,urls,类加载信息
heapdump 类似 jmap 命令的 heap dump 功能
reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
命令详解
dashboard
ID
: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应
NAME
: 线程名 GROUP: 线程组名 PRIORITY: 线程优先级, 1~10之间的数
字,越大表示优先级越高
STATE
: 线程的状态
CPU%
: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用
量求和,再算出每个线程的cpu使用占比。
TIME
: 线程运行总时间
INTERRUPTE
: 线程当前的中断位状态
DAEMON:
是否是daemon线程
thread
thread
查看所有线程信息,同时会列出每个线程的 CPU 使用率
thread [N]
查看 CPU 消耗较高的 N号线程信息,可以看到 CPU 使用较高的方法和行数。
thread -n
[显示的线程个数] ,就可以排列出 CPU 使用率 Top N 的线程
thread | grep pool
命令可以查看线程池里的线程信息
thread -b
命令查看直接定位到死锁信息。支持synchronized
线程常见状态:
RUNNABLE
运行中TIMED_WAITIN
调用了以下方法的线程会进入
Thread#sleep()
Object#wait() 并加了超时参数
Thread#join() 并加了超时参数
LockSupport#parkNanos()
LockSupport#parkUntil()WAITING
当线程调用以下方法时会进入:
Object#wait() 而且不加超时参数
Thread#join() 而且不加超时参数
LockSupport#park()BLOCKED
阻塞,等待锁
jad
jad com.demo.arthas.ArthasTest 可以使用 jad 命令直接反编译 class
ognl ‘@com.demo.arthas.ArthasTest@hashSet’ 查看变量 hashSet 中的数据
ognl ‘@com.demo.arthas.ArthasTest@hashSet.size()’ 查看静态变量 hashSet 大小
trace
使用 trace 命令开始检测耗时情况
启动应用后,在arthas控制台输入如下命令:
trace com.demo.User.UserController getUser
访问http://localhost:8080/arthas/user?uid=3
继续跟踪耗时高的方法输入命令:
trace com.demo.User.UserService get
然后再次访问:http://localhost:8080/arthas/user?uid=3
monitor
使用 monitor 命令监控统计方法的执行情况。
每5秒统计一次 com.demo.User.UserService 类的 get 方法执行情况。
输入命令:monitor -c 5 com.demo.User.UserService get
访问:http://localhost:8080/arthas/user?uid=3。
watch
使用 watch 命令轻松查看输入输出参数以及异常等信息。
查看入参出参
输入命令:
watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'
命令解释:'{params,returnObj,throwExp}'表示观测对象,这里选择了入参、出参和异常,-n 5表示观测到5次后停止,-x 3表示打印观测对象的时候只打印3层嵌套结构,‘params[0].getPlayToolDO().getId()==588’ 为条件表达式,满足该条件的才会被观测到
stack
使用 stack命令查看方法的调用信息。
观察 类com.demo.User.UserService 的 mysql 方法调用路径
输入命令:stack com.demo.User.UserService mysql
访问:http://localhost:8080/arthas/user?uid=3
tt
方法调用时空隧道
tt 命令方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信
息,并能对这些不同的时间下调用进行观测 。
开始记录方法调用信息:tt -t com.demo.User.UserService check
多次访问:http://localhost:8080/arthas/user?uid=3
查看记录的方法调用信息: tt -l
查看调用记录的详细信息(-i 指定 INDEX): tt -i 1005
热部署
热部署步骤
-
本地修改代码,编译好后再上传到服务器上。有的服务器不允许直接上传文件,可以使用
base64
命令来绕过 -
retransform 指定的 .class 文件
$ retransform /tmp/MathGame.class retransform success, size: 1, classes: demo.MathGame
-
查看retransform entry
$ retransform -l Id ClassName TransformCount LoaderHash LoaderClassName 1 demo.MathGame 1 null null
-
消除retransform的影响
- 删除这个类对应的 retransform entry(retransform -d 1)
- 重新触发 retransform
注意点
arthas retransform热部署时候,不能修改方法名、属性字段,只能修改方法体里面的代码。
正在跑的函数,没有退出不能生效
不建议使用redefine命令热部署。执行完redefine之后,再执行jad/watch/trace/monitor/tt等命令,会使热部署失效
退出arthas
quit命令
只是退出当前 Arthas 客户端,Arthas 的服务器端并没有关闭,所做的修改也不会被重置。
stop命令
关闭 Arthas 服务端,所有 Arthas 客户端全部退出。但是用 retransform 重加载的类内容不会被重置