一.下载安装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
十一.