如果我们用idea作为开发工具那么可以安装以下插件
安装完以上插件后,我们不再需要自己去敲arthas命令,在idea选择方法右击 arthas Command->选相关命令,如 watch、trace
watch命令
watch com.xxl.job.test serviceA '{params,returnObj,throwExp}' -n 5 -x 3 | grep "job"
params: 入参详细信息
returnObj: 返回的详细信息
throwExp: 方法有异常时,会返回详细异常信息
-n 5: 最多输出5次调用
-x 3: 是指定输出结果的属性遍历深度,默认为 1, 这里当有返回list,并要看list里面结果的时候就需要调大此值
grep "job" 一般情况不需要带此参数,当返回的结果很大,但又想找精准信息时,可以通过grep
当然还有很多其他参数比喻-b -s等等
用途: 比喻A服务调用B服务的某个接口,A服务的业务流程依赖B服务返回的结果继续执行,当出现bug时,我们可以watch B服务的接口来查看返回的信息是否满足接下来的业务逻辑,也可以查看到B服务接口是否出现异常,这是我平时用到最多的场景。项目中不会到处打印日志,可以接触watch命令来输出入参出参信息来排查问题。
更多用法可以参考:https://arthas.aliyun.com/doc/watch.html
Trace命令
trace com.xxl.job.test serviceA
用途:
当一个方法的代码过长并有很多分支条件时,我们要知道方法执行的逻辑具体走到了哪个分支,这时候可以用trace命令来查看具体执行了哪些代码
性能测试过程中,经常会碰到接口请求耗时长,但是又不知道具体是哪个环节哪段代码耗时长,trace命名可以看到每一行代码的耗时
如果要查大于100ms的结果,可以加上'#cost>100' 参数
更多用法可以参考:https://arthas.aliyun.com/doc/trace.html
Jad命令
jad com.xxl.job.test classA
用途:经常会出现本地的代码与线上代码不一致情况,会怀疑是否打包失败,还是漏提交代码,这时候可以在生产执行jad命令反编译class来查看代码是否和预期一致, 而不需要下载整个jar来进行反编译。
更多用法可以参考:https://arthas.aliyun.com/doc/jad.html
Thread命令
thread -all
显示所有匹配线程信息,有时需要获取全部JVM的线程数据进行分析。
thread id, 显示指定线程的运行堆栈
[arthas@26605]$ thread 12"sentinel-command-center-executor-thread-1"Id=12RUNNABLE(in native)
at java.net.PlainSocketImpl.socketAccept(NativeMethod)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:560)
at java.net.ServerSocket.accept(ServerSocket.java:528)
at com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter$ServerThread.run(SimpleHttpCommandCenter.java:188)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
thread -b, 找出当前阻塞其他线程的线程
找到阻塞其他线程的线程,即当前占用锁的线程
注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。
thread -i, 指定采样时间间隔
thread -i 1000 : 统计最近1000ms内的线程CPU时间。
thread -n 3 -i 1000 : 列出1000ms内最忙的3个线程栈
thread –state ,查看指定状态的线程
monitor命令:监控方法的执行情况
包括:成功次数、失败次数、平均响应时间、失败率
monitor -c 10 com.xxxx.xxxxController update
- 监控update这个方法的执行情况
- -c 10 指定统计周期为10秒统计一次,默认是120秒统计一次
结论:
以上就是平时实际工作中经常用到的一些命令,更多可以参考:https://arthas.aliyun.com/doc/