欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

arthas使用

发布时间:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 arthas使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

参考文献

总结

以上是生活随笔为你收集整理的arthas使用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。