官网:https://arthas.aliyun.com/doc/
概述
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
1.这个类从哪个jar包加载的?为什么会报各种类相关的 Exception?
2.我改的代码为什么没有执行到?难道是我没commit?分支搞错了?
3.遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?
4.线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5.是否有一个全局视角来查看系统的运行状况?
6.有什么办法可以监控到JVM的实时运行状态?
7.怎么快速定位应用的热点,生成火焰图? 运行环境要求
Arthas支持JDK6+,支据Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab自动补全功能进一步方便进行问题的定位和诊断。
安装
Window安装:
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
选择需要的
下载需要的jar包,下载到C:\Users\hspcadmin.arthas\lib\3.5.0\arthas
1.在Linux下在线安装的方式与在Windows下的安装相同
⒉.如果要使用离线的安装方式,先下载完成的zip到本地,再解压到任意的目录即可
因为jar包是绿色,要卸载的话,直接删除2个目录
.arthas安装目录 logs的日志记录目录
使用
如果端口号被占用。也可以通过以下命令换成另一个端口号执行
java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
也可以通过浏览器连接arthas:Arthas目前支&wWeb Console,用户在attach成功之后,可以直接访问: http://127.0.0.1:3658/.可以填入IP,远程连接其它机器上的arthas.
命令
1:dashboard仪表板,过段时间就刷新,按q退出
2:thread命令查看正在运行的线程
3:cls:清屏
4:jad反编译源代码:
jad demo.MathGame
5:watch监视
观察指定方法的调用情况
watch demo.MathGame primeFactors returnObj
watch 包名.类名 方法名
6:JVM
查看当前JVM信息
COUNT:JVM当前活跃的线程数
DAEMON-COUNT:JVM当前活跃的守护线程数
PEAK-COUNT:从JVM启动开始曾经活着的最大线程数
STARTED-COUNT:从JVM启动开始总共启动过的线程次数
DEADLOCK-COUNT:JVM当前死锁的线程数
7:trace
方法内部调用路径,并输出方法路径上的每个节点上耗时
quit或者exit:只是退出,断开连接
完全退出:stop
help:
cat:
grep:
-n :显示行号
-i:忽略大小写
-m 行数:最大显示行数
-e ‘正则’:
pwd:
session:查看当前会话的信息
reset:重置增强类,将被Arthas增强过的类全部还原,Arthas服务器关闭是会重置所有增强的类。
trace:追踪
version:输出版本号
history:显示所以敲过的命令
keymap:显示快捷键以及自定义快捷键
JVM相关命令
dashboard:
thread:查看当前 JVM 的线程堆栈信息
-b:处于阻塞状态的线程
jvm:查看当前 JVM 的信息
sysprop:查看当前JVM的系统属性(System Property
)
sysenv——查看JVM的环境变量
- getstatic——查看类的静态属性
getstatic demo.MathGame random
- ognl——执行ognl表达式
$ ognl '@java.lang.System@out.println("hello")'
null
- heapdump——dump java heap, 类似jmap命令的heap dump功能
class/Classloader相关
- sc——查看JVM已加载的类信息
# 打印类的详细信息
$ sc -d demo.MathGame
# 打印类的Field信息
$ sc -d -f demo.MathGame
- sm——查看已加载类的方法信息
$ sm java.lang.String
java.lang.String-><init>
java.lang.String->equals
java.lang.String->toString
$ sm -d java.lang.String toString
declaring-class java.lang.String
method-name toString
modifier public
annotation
parameters
return java.lang.String
exceptions
- jad——反编译指定已加载类的源码
$ jad java.lang.String
- mc——内存编译器,内存编译
.java
文件为.class
文件 - retransform——加载外部的
.class
文件,retransform到JVM里 - redefine——加载外部的
.class
文件,redefine到JVM里 - dump——dump 已加载类的 byte code 到特定目录
- classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
- monitor——方法执行监控
- watch——方法执行数据观测
- trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
- stack——输出当前方法被调用的调用路径
- tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
profiler/火焰图
基于性能结果产生SVG图片,用来展示CPU的调用栈;
y轴表示调用栈,每一层都是一个函数,调用栈越深,火焰越高;顶部就是正在执行的函数,下方都是他的父函数;
x轴表示抽样数,如果一个函数在x轴占据的宽度越宽,就表示它被抽到的次数多,即执行时间长;x轴不代表时间先后,而是调用栈合并后,按子母顺讯排列的。
火焰图就是看顶层的哪个函数占据的宽度最大,只要有平顶,就表示该函数可能存在性能问题;
- profiler–使用async-profiler对应用采样,生成火焰图
开启
profiler start
停止
profiler stop