arthas使用
基础命令
- 启动:安装文件夹下执行
wget https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
- 查看dashboard:输入dashboard,会展示当前进程信息,按ctrl+c可中断执行
ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTED DAEMON
552 Timer-for-arthas-dashboard-8cbf395a-b670-4c system 10 RUNNABLE 65 0:0 false true
176 sentinel-time-tick-thread main 5 TIMED_WAITING 29 52:56 false true
186 DubboResponseTimeoutScanTimer main 5 TIMED_WAITING 2 3:10 false true
124 New I/O server boss #1 ([id: 0x1be37c6d, /0 main 5 RUNNABLE 1 0:15 false true
33 Abandoned connection cleanup thread main 5 TIMED_WAITING 0 0:6 false true
509 AsyncAppender-Worker-arthas-cache.result.As system 9 WAITING 0 0:0 false true
120 AsyncResolver-bootstrap-0 main 5 TIMED_WAITING 0 0:0 false true
237 AsyncResolver-bootstrap-executor-0 main 5 WAITING 0 0:0 false true
507 Attach Listener system 9 RUNNABLE 0 0:0 false true
107 ClientHouseKeepingService main 5 TIMED_WAITING 0 0:9 false true
435 ClientHouseKeepingService main 5 TIMED_WAITING 0 0:7 false true
29 Curator-ConnectionStateManager-0 main 5 WAITING 0 0:0 false true
84 Curator-ConnectionStateManager-0 main 5 WAITING 0 0:0 false true
32 Curator-Framework-0 main 5 WAITING 0 0:0 false true
87 Curator-Framework-0 main 5 WAITING 0 0:0 false true
67 Curator-TreeCache-0 main 5 WAITING 0 0:0 false true
Memory used total max usage GC
heap 242M 583M 583M 41.52% gc.parnew.count 563
par_eden_space 161M 245M 245M 65.61% gc.parnew.time(ms) 3692
par_survivor_space 1M 30M 30M 5.06% gc.concurrentmarksweep.count 3
cms_old_gen 79M 307M 307M 25.89% gc.concurrentmarksweep.time(ms) 299
nonheap 179M 183M 744M 24.18%
code_cache 60M 61M 240M 25.14%
metaspace 107M 109M 256M 41.92%
Runtime
os.name Linux
os.version 3.10.0-862.9.1.el7.x86_64
java.version 1.8.0_191
java.home /usr/java/jdk1.8.0_191/jre
systemload.average 1.18
processors 2
uptime 430681s
- 通过jad反编译class:
jad com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
进阶命令
class/classloader相关
- sc-查看jvm已经加载的类信息:Search-Class简写,这个能搜索出所有已经加载到jvm的class,支持参数[d],[E],[f],[x:]
- -d: 输出当前类的详细信息
- -e: 开启正则表达式匹配,默认为通配符匹配
- -f: 输 出当前类的成员变量信息,需要配合-d 一起使用
- -x : 指定输出静态变量时属性的遍历深度,默认0
//模糊搜索
$ sc com.zhenai.profile.provider.modules.member.service.impl.*
//输出类详细信息
$ sc -d com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
//输出详细信息基础上加上fields信息
sc -d -f com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
- sm-Search-Method简写,这个命令能搜索出已经加载的class信息的方法信息。参数如下
- -d : 展示每个方法详细信息
- -e : 开启正则默认通配符匹配
//列出所有方法
sm com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
//方法详细信息
sm -d com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
- jad- 将jvm中实际运行的class的byte code反编译成java代码。
//反编译类
jad com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
//反编译指定函数
jad com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress
- mc-Memory Compiler内存编译器,编译.java文件生成class文件
mc /temp/test.java
- monitor-方法执行监控,非实时返回命令,监控纬度如下:
- timeStamp-时间戳
- class-java类
- method-方法
- total-调用次数
- success-成功次数
- fail-失败次数
- rt-评价rt
- fail-tate - 失败率
//监控getAddress方法,参数-c 统计周期,默认120秒,此处设置5秒
monitor -c 5 com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress
- watch- 方法执行数据观测,参数如下
- -b: 方法调用之前观察
- -e: 方法异常后观察
- -s : 方法返回后观察
- -f : 方法结束后(正常,异常返回)观察
- -E: 开启正则
- x: 指定输出结果的属性遍历深度
- 这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写
"{params,returnObj}"
,只要是一个合法的 ognl 表达式,都能被正常支持。
//基础用法
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2
//观察入参,会发现对比上一个返回值是null
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2 -b
//同时观察方法调用前后, 参数里-n 2,表示只执行两次, 此处第一次输出是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2 -b -s -n 2
//跳转-x值观察具体方法参数, -x表遍历深度,可以调整来打印具体的参数和结果内容
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, target}" -x 2
//筛选条件对参数筛选
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params[0],target}" "params[0]>0"
//异常情况抛出
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params[0],thromExp}" -e -x 2
//耗时过滤
watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress '{params, target}' '#cost>10' -x 2
- trace- 方法内部调用路径,并输出方法路径上的每一个节点耗时,参数:
- [E] : 正则匹配
- [n:] : 命令执行次数
- ”#cost“ : 方法执行耗时
//同时监控多个方法, -j 表示过滤JDK函数
trace -E com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress|getExpect
//耗时筛选,此处1 指方法中某个步骤超过1毫秒,并非总执行时间
trace -E -j com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress|getExpect '#cost>1'
- stack- 输出当前方法被调用的调用路径
//参数 -n表示执行次数,表示下两个请求将被监控, params[0]>0 参数过滤
stack com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress 'params[0]>0' -n 2
//耗时筛选
stack com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress '#cost>5'
- tt -方法执行的时空隧道,记录指定方法每次调用入参以及返回值,
//基本使用 -n参数指定监控次数,不指定无限制,会将jvm内存耗尽
tt -t com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress -n 3
返回如下:
//筛选指定方法名字调用
tt -s 'method.name=="getAddress"'
//查看指定编号对应详细信息
tt -i 1001
//重做指定编号请求
tt -i 1004 -p