Arthas使用笔记

Arthas使用笔记,第1张

视频地址:黑马程序员Java教程Arthas阿里巴巴开源线上问题诊断利器_哔哩哔哩_bilibili

Mac 下安装Arthas

打开命令窗口,输入:curl -O https://alibaba.github.io/arthas/arthas-boot.jar

下载完成以后输入命令:java -jar arthas-boot.jar 运行

这个时候出现报错,原因是没有在.bash_profile文件中配置JAVA_HOME的路径

相关链接:

  • 查看jdk的安装路径:/usr/libexec/java_home -V
  • echo $JAVA_HOME 查看是否可以输出JAVA_HOME的路径,如果无法输出
  • 输入命令:vim ~/.bash_profile ,进行配置
  • source ~/.bash_profile 刷新文件

 启动Arthas,选择要监控的程序

         停止Arthas,输入命令:stop,quit和exit只是退出当前连接,Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连上。

命令

1.dashboard命令

[arthas@37323]$ dashboard

屏幕信息过多,用命令cls清除,按q或者Ctrl+C退出dashboard

2. thread命令

[arthas@37323]$ thread

查询当前运行的所有线程

如果想要看具体某个线程的详细信息thread 线程号,例如

[arthas@37323]$ thread 83

参数名称参数说明
数字线程id
[n:]指定最忙的前n个线程并打印堆栈
[b]找当前阻塞其他线程的线程
[i]指定cpu占比统计的采样间隔,单位为毫秒

举个🌰:

thread -n 3 : 打印最忙的前三个线程

thread 1 : 打印1号线程的信息

thrad -b : 打印阻塞的线程

thread --state WAITING : 查看等待中的 线程,也有查看其他状态的[RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, NEW, TERMINATED]

 

3.jad命令 

反编译指定的类,使用方法 jad 包名.类名,例如

[arthas@82911]$ jad com.king.test.Test

jad 包名.类名 --source-only 只显示源码

[arthas@21394]$ jad com.king.test.Test --source-only

 jad 包名.类名 方法名 : 只反编译该方法

 

4. watch命令

 watch 包名.类名 方法名 returnObj

查看该方法的返回值

[arthas@83467]$ watch com.king.test.Test add returnObj

 [arthas@73327]$ watch com.king.test.Test add "{params,returnObj}" -x 2

查看Test类的add方法的入参和出参  参数层级2层

 不传-x 默认一层

 [arthas@73327]$ watch com.king.test.Test add "{params,returnObj}"  -x 2 -b

注意下面的返回值是null,-b是前置方法,在方法调用前拦截,所以看不到

[arthas@89499]$ watch com.king.test.Test add "target" -x 2 -b

[arthas@89499]$ watch com.king.test.Test add "target.属性" -x 2 -b

[arthas@90010]$ watch com.king.test.Test random "{params,target,returnObj}" -x 2 -b -s -n 2

-b 方法执行前  -s方法执行后  -n执行几次  -x参数深度

[arthas@90010]$ watch com.king.test.Test add "{params[0],target}" "params[0]<3" -x 2

监视第一个参数小于0的

5. JVM相关命令

jvm : 查看虚拟机的相关信息

sysenv : 虚拟机的相关信息 

sysprop : 系统属性

vmoption : 查看虚拟机的属性,可以修改虚拟机的属性值

 getstatic : getstatic 类型 静态属性名称 例如: [arthas@21394]$ getstatic com.king.test.Test map

ognl : 

【ognl '@类@静态属性' 】ognl '@com.king.test.Test@map'

【ognl '#value1=@System@getProperty("java.home"),#value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'】这条指令的意思是获取System.getProperty("java.home")的值和System.getProperty("java.runtime.name")的值,放入集合中

 6. class和classloader的相关命令

  • sc(search class)

参数说明

参数名称参数说明
clas-pattern类名表达式匹配,支持全限定名,如com.taobao.test.AA,也支持com/taobao/test/AA这样的格式,这样,我们从异常堆栈里面吧类名拷贝过来的时候,不需要手动把/替换成.
method-pattern方法名表达式匹配
[d]输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,会出现多次
[E]开启正则表达式匹配,默认为通配符匹配
[f]输出当前类的成员变量信息(需要配合参数d一起使用)

 sc 包名.* : 显示这个包下的所有类(我这个包下只有一个类)

sc 包名.* -d : 当前类的详细信息

 

sc 包名.* -df : 当前类的详细信息 以及成员变量

  •  sm(search method) 
参数名称参数说明
clas-pattern类名表达式匹配
method-pattern方法名表达式匹配
[d]展示每个方法详细信息
[E]开启正则表达式匹配,默认为通配符匹配

sm 包名.类名 : 查看该类的方法 例如:sc com.king.test.Test

 sm 包名.类名 -d : 查看该类每个方法的详细信息

 组合拳

  1. jad    将字节码反编译成源代码 
    具体命令参考前面
     
  2. mc    将源代码编译成字节码
    mc 绝对路径类名


    mc 绝对路径类名 -d class存放的路径
  3. redefine    将新生成的字节码文件在内存中运行

        redefine class绝对路径

组合拳的实际 *** 作:

1.[arthas@21394]$ jad --source-only com.king.test.Test > /Users/wangyaoyao/log/Test.java

        将Test类进行反编译到/Users/wangyaoyao/log的路径下

2.修改反编译的文件后执行[arthas@21394]$ mc /Users/wangyaoyao/log/Test.java -d /Users/wangyaoyao/log 该命令,将Users/wangyaoyao/log/Test.java编译到/Users/wangyaoyao/log目录下

3.执行命令重新将该类加载到内存中,实现热加载

[arthas@21394]$ redefine /Users/wangyaoyao/log/com/king/test/Test.class

 

 原来的方法执行过程中不打印任何信息,经过修改以后。则打印信息

 重新加载该类以后

dump命令 

 dump 包名.类名:获取运行中类的字节码文件

 classloader命令

classloader

 classloader -l 可以看到父加载器

 classloader -c hashcode  查看该hashcode对应的加载器在那个jar包

 classloader -c hashcode  -r /xxx/xxx/xxx.class 查看/xxx/xxx/xxx.class所在的jar

  classloader -c hashcode -load xxxxx.xxxx.xxx  用这个加载器去加载某个类

Monitor命令

非实时命令,用法 monitor 包名.类名 方法名 ,标识监控该类的方法,默认每60秒,打印一次结果. 该时间内的调用次数,成功次数,失败次数,平均响应时长,失败率

 如果想要按照自己的时间去打印结果:monitor 包名.类名 方法名 -c 时间(单位秒)

 trace命令

trace 包名.类名 方法名 : 追踪该方法的执行,每个阶段的耗时

 trace 包名.类名 方法名 -n 数字M: 追踪该方法的执行,每个阶段的耗时。执行M次后停止

 trace --skipJDKMethod false 包名.类名 方法名 -n 数字M: 追踪该方法的执行,每个阶段的耗时。执行M次后停止,不跳过jdk的方法

 trace --skipJDKMethod false 包名.类名 方法名 '#cost > 0.8': 追踪该方法的执行,过滤耗时大于0.8ms的

 statck命令

stack 包名.类名 方法名 : 查看该方法的调用路径,是谁调用的该方法

[arthas@90010]$ stack com.king.test.Test add

 [arthas@90010]$ stack com.king.test.Test add "params[0]<3" -n 2 

查询add方法第一个参数小于3,执行两次

[arthas@90010]$ stack com.king.test.Test add "#cost>0.1" -n 2 

查看该方法耗时大于0.1ms的,执行两次

tt命令 

tt -t 包名.类名 方法名 :记录方法的调用记录

tt -t com.king.test.Test add

 tt -l : 查看方法记录

 tt -i index : 查看具体某条记录的详细信息

 tt -i index -p :使用index这条记录的参数重新执行一次该方法   p的全拼是play

 tt -i 1006 -p --replay-times 2 : 使用1006这条记录的参数执行两次 --replay-times 执行次数

 tt -i 1006 -p --replay-times 2 --replay-interval 2000

使用1006这条记录的参数执行两次 --replay-times 执行次数,执行间隔为2000毫秒 --replay-interval执行间隔时间

 

 options命令

 设置和查看arthas的全局环境变量,一般不使用

options 属性 修改以后的值 :修改全局变量的属性值

 

profiler命令--火焰图

profiler start : 启动profiler开始采样,默认情况生成cpu的火焰图

profiler list: 所有支持的事件

 

profiler getSamples:获取采样数量

profile status : 查看采样运行的时间

profile stop : 停止,并输出火焰图的位置

profile stop --format {html jfr} : 生成火焰图的格式 jrf不知道是啥格式

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/738284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存