Arthas使用指南

官方文档: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”插件
  • 方法名单击右键,选择命令,示例如下图:

image.png

常用命令

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 重加载的类内容不会被重置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值