Arthas
Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题
一、安装启动arthas
1.下载arthas-boot.jar
官网:https://arthas.aliyun.com/doc/quick-start.html
Maven下载:
com.taobao.arthas
arthas-spring-boot-starter
3.4.8
runtime
2.启动arthas-boot.jar(就是启动arthas)
java -jar arthas-boot.jar
3.选择你要调试的项目
输入1 回车
二、常用命令
1.dashboard 数据面板
持续刷新的,按Ctrl+C或者Q退出
2.cls清屏
3.thread查看线程信息
4.jad 反编译java的class为java代码
jad com.jinhaoyang.erp.action.ProductAction(路径)
5.watch 监视(有点类似Debug)
watch com.jinhaoyang.erp.action.ProductAction findAllInInstruments returnobj
6. 退出arthas 的命令,quit或者exit退出绘画还在,stop是真正退出arthas。
三、基础命令之一
1.help 查询所有命令
2.cat 显示文件内容
3.grep 匹配查询和linux里的grep命令类似,但它只能用于管道命令
sysprop | grep java -n -m10 只显示十行
sysprop | grep -e “\d{2,}” 正则表达式 两个数字也上的
4.pwd 返回当前工作目录和linux命令类似(pwd: Print Work Directory 打印当前目录)
5. cls清屏(windows一样清屏也是cls)-----linux的清屏是clear
四、基础命令之二
1.session :查看当前会话的信息
2.reset 重置增强类,将被Arthas增强过的类全部还原,Arthas服务端关闭时会重置所有增强过的类
3.version:加载当前目标java进程加载的Arthas版本号
4.history :打印命令历史
5.quit 退出当前Arthas客服端,其他Arthas客服端不影响
6.stop 是关闭Arthas服务器,所有Arthas客服端全部退出。
7.keymap: Arthas快捷键列表及自定义快捷键
五、jvm相关的命令之一
1.dashboard :显示当前系统的实时数据面板,
2.thread 线程相关 查看当前jvm的线程堆栈信息
thread -i 1000 -n 3 1000毫秒内最方面的3个线程
thread --state WAITING 查看处于等待状态的线程
3.jvm 查看Java虚拟机的信息
4. sysprop 修改java临时的属性
如:sysprop user.country 改为中文的
sysprop java.version java的路径
六、jvm相关的命令之二
1.sysenv (System Environment Variables)
查看所有的环境变量
2. vmoption 查看虚拟机的相关的参数
vmoption PrintGCDetails true 更新指定的选项
3.getstatic 查看类的静态属性
getstatic 类名 属性
4.ognl 3.0.5版本新增的功能有一定的语法要求
语法强大但是,但是有点复杂
七、Class/classsloader 相关命令之一
1.sc:Search Class(缩写)
查看jvm已加载的类信息,这命令能搜索出所有已经加载到jvm中的class信息,sc默认开启了子类匹配功能。如果想要精确的匹配,打开 options disable-sub-class true 开关。
2.sm:Search Method (简写)
搜索类所声明的方法,父亲则无法看到。
八、Class/classsloader 相关命令之一
1.jad 把字节码文件反编译成源代码了
jad java.lang.String trim 反编译String的trim方法
2.mc 在内存中把源代码编译成字节码文件
mc /root/Hello.java -d /root 把Hello.java文件编译为Hello.class到root目录下
3.redefine 加载外部的.class文件,redefine 到Jvm里
《Arthas进阶》
一、类和类加载器相关的命令
1.dump 将已加载的字节码文件保存到特定目录:/logs/arthas/classdump/
dump java.lang.String
2.classloader获取类加载器的信息
classloader
classloader -l
classloader -c 680f2739
classloader -c 680f2739 -r java/lang/String.class
classloader -c 680f2739 -load java.lang.String
3.monitor :监控指定类中的执行情况 (120秒监视一次)
monitor dem.MathGame primeFactors -c 5 (5秒执行一次)
4.watch 观察到指定方法的调用情况
1.观察类中方法出参和返回值,结果属性遍历深度为2
2.观察方法的入参,对比前一个例子,返回值为空(事件点为方法执行前,因此获取不到返回值)
3.观察当前对象中的属性,如果想查方法运行前后,当前对象中的属性,可以使用target关键字,代表当前对象
4.查看target某一个属性 target.illegalArgumentCount
5.同时观察方法调用前和方法调用后,参数里-n 2,表示只执行两次
watch com.jinhaoyang.erp.action.LoginAction execute “{params,target,returnObj}” -x 2 -b -s -n 2
6.条件表达式的列表,输出第1参数小于的情况
watch com.jinhaoyang.erp.action.LoginAction execute “{params[0],target}” “params[0]>0”
小结
5.trace 对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。
trace函数指定类的指定方法
1.trace com.jinhaoyang.erp.action.LoginAction execute
红色表示执行时间最的方法
2.trace com.jinhaoyang.erp.action.LoginAction execute -n 2 执行两次
3.trace --skipJDKMethod false com.jinhaoyang.erp.action.LoginAction execute -n 2
4.调用执行时间大于某个值的(过滤)
trace com.jinhaoyang.erp.action.LoginAction execute “#cost>100”
小结
6.stack 输出当前方法被调用的调用路径
1.方法上层调用关系
stack com.jinhaoyang.erp.action.LoginAction execute
2.通过条件表达式来过滤,第0个参数的值小于0
stack com.jinhaoyang.erp.action.LoginAction execute “params[0]<0” -n 2
3.执行时间大于0.5秒的
stack com.jinhaoyang.erp.action.LoginAction execute “#cost>0.5”
7.tt time-tunnel时间隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测
1.tt -t com.jinhaoyang.erp.action.LoginAction execute 记录方法当前方法每次调用的环境现场
tt -i 1008
tt -i 1008 -p 在调用一次1008
tt -i 1008 -p --replay -times 3 调用三次1008
tt -i 1008 -p --replay -times 3 --replay-interval 2000 2秒调用一次
8.options
9.Profiler 火焰图
生成火焰图
生成的火焰图