视频地址:黑马程序员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 : 查看该类每个方法的详细信息
组合拳
- jad 将字节码反编译成源代码
具体命令参考前面
- mc 将源代码编译成字节码
mc 绝对路径类名
mc 绝对路径类名 -d class存放的路径 - 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不知道是啥格式
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)