一.下载安装arthas

wget https://alibaba.github.io/arthas/arthas-boot.jar

 

二.启动,退出,停止

1.启动方法

java -jar arthas-boot.jar

 

2.退出当前指定的某一个arthas的命令

Q 或者 Ctrl+C

 

 

3.退出arthas[只能退出当前会话,arthas server并未停止执行]

exit 或者 quit

 

退出后可以通过 java -jar arthas-boot.jar 重连 arthas server服务

 

 

4.完全退出arthas server

使用 stop

 

5.仪表盘

dashboard
堆内存信息

heap 堆内存
ps_eden_space : 对象被创建的时候首先存放的区域
ps_survivor_space : eden space内存区域中经过垃圾回收后没有被回收的对象
ps_old_gen: 存放新生代中经过多次垃圾回收仍然存活的对象(上面两个都是新生代)
nonheap: 非堆内存(通常说的栈内存)
code_cash: 存放JIT所编译的机器码
metaspace: 永久代

 

 


三.trace使用,查看方法内一级子方法调用耗时【往下的调用链路】

 

1.基础使用示例:【也可以看出来整个调用栈中哪行抛出异常了throws Exception】

trace 类路径 方法名
trace com.test.ClassA methodB

 

 

2.如果本方法调用次数很多,则只想捕获10次 的调用 就退出Q

trace 类路径 方法名 run -n 10

 

 

3.tracem默认不展示JDK方法调用耗时,如果想打印出来,需要显式设置 --skipJDKMethod false

trace --skipJDKMethod false 类路径 方法名

 


4.匹配多个类或多个函数

trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

 


5.排查时间大于2ms的调用

trace com.test.ClassA methodB '#cost > 2'

 

 


四.stack使用,查看方法被调用的 调用链 【往上的调用链路】

1.基本使用示例:

stack com.test.ClassA methodB

 

 

 

 

五. 反编译


1. 查看具体 某个线程的 调用堆栈

thread PID

 


2.查看源码

查看某个类的源码

jad com.test.ClassA

 

查看某个类某个方法的源码

jad com.test.ClassA 方法A

 

 

3.只查看源码

jad --source-only com.test.ClassA

 


4.

 

 

 

六.查看具体函数

1.基础使用示例:

sm com.test.ClassA

sm com.test.ClassA methodA

 

 

2.查看某个函数的详细信息 加上属性 -d

sm -d com.test.ClassA methodA

 

 

 

七.查看JVM已经加载的类信息

1.具体某个类的JVM加载信息 【如果它是接口,还会把实现类打印出来】

sc -d com.test.ClassA

 


2.正则匹配JVM加载类的信息

sc -d com.test.Class*

或者

sc -d com.test.*B

 

 


八.动态实时监控接口

1.动态实时监控接口出入参和异常信息 层级是3层,捞取5次请求

watch com.test.ClassA methodA '{params,returnObj,throwExp}' -v -n 5 -x 3 '1==1'

 

 

2.同上,但是指定入参的第二个参数等于true的

watch com.test.ClassA methodA '{params,returnObj,throwExp}' 'params[1] == true' -v -n 5 -x 3 '1==1'

 

 

3.

 

 

 

九.查看类的静态成员变量

1.查看类的静态成员变量 层级是3层

getstatic com.test.ClassA staticA -x 3

 

 

十.查看某个Spring管理的Bean的属性值

1.监听到拦截器请求的一个下标,得到一个数字

tt -t -n 1 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

 

2.使用得到的下标进行替换,从上下文中获取到该Bean,就可以执行该Bean的方法了

用得到的数字替换1002,taskExecutor就是bean的name, getBean("taskExecutor")之后就可以.该Bean提供的方法,或者直接查看该Bean的属性值

taskExecutor 是举例的一个Bean的name,可以是xxx,也可以是你自己的Bean的name

 

 

tt -i 1002 -w 'target.getApplicationContext().getBean("taskExecutor").getThreadPoolExecutor().getQueue().size()'

 

3.或者直接查看该Bean的属性值,查看3层

tt -i 1002 -w 'target.getApplicationContext().getBean("taskExecutor")' -x 3

 

 

 

 

十一.