Alibaba开源的Java诊断工具,在线排查问题,无需重启,动态跟踪Java代码,实时监控JVM状态
Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断
Arthas可以帮助我们解决以下问题
这个类从哪个jar包加载的?为什么会报各种类相关的Exception
我改的代码为什么没有执行到?难道我没commit?分支搞错了
遇到问题无法在线上debug,难道只能通过日志重新发布吗
线上遇到某个用户的数据处理问题,但线上同样无法debug,线下无法重现
是否有一个全局视角来查看系统的运行情况
有什么办法可以监控到JVM的实时运行情况
怎样快速定位应用的热点,生成火焰图?
基于哪些工具开发而来
greys-anatomy:Arthas基于Greys二次开发而来
termd:是一款优秀的命令行程序开发框架
crsh:Arthas的文本渲染功能基于Crash中的文本渲染功能开发
cli:Arthas的命令行界面基于vert.x提供的cli库进行开发
compiler:Arthas里的内存编译器代码来源
Apache Commons Net :Arthas里的Telnet Client代码来源
Java Agent:运行在main方法之前的拦截器,它内定的就去名叫premain,先执行premain方法,然后执行main方法
ASM:一个通用的Java字节码操作和分析框架,它可以用于修改现有的类或直接以二进制形式动态生成类,ASM提供了一些常见的字节码转换和分析算法,可以从它们构建定制的复杂转换和代码分析工具,它的设计和实现就可能小和快,更关注性能,非常适合在动态系统中使用
Arthas安装
①先在Linux上安装JDK,设置环境变量 测试代码
[ root@mysql8 ~]
anaconda-ks.cfg jdk-8u411-linux-x64.tar.gz logs mysql80-community-release-el7-11.noarch.rpm
[ root@mysql8 ~]
[ root@mysql8 ~]
[ root@mysql8 ~]
JAVA_HOME = /usr/local/jdk1.8.0_411
export PATH = $PATH : $JAVA_HOME /bin
[ root@mysql8 ~]
[ root@mysql8 /]
[ root@mysql8 /]
[ INFO] JAVA_HOME: /usr/local/jdk1.8.0_411/jre
[ INFO] arthas-boot version: 3.7 .2
[ INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1 . Then hit ENTER.
* [ 1 ] : 1568 ThreadDeadLock
1
[ INFO] arthas home: /root/.arthas/lib/3.7.2/arthas
[ INFO] Try to attach process 1568
[ INFO] Attach process 1568 success.
[ INFO] arthas-client connect 127.0 .0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. '' --. .--'| ' --' | / O \ ' .-'
| .-. || ' --'.' | | | .--. || .-. | ` . ` -.
| | | || | \ \ | | | | | || | | | .-' |
`--' ` --'` --' ' --' `--' ` --' ` --'`--' ` --'` -----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.7 .2
main_class
pid 1568
time 2024 -06-06 21 :37:48
[ root@mysql8 /]
[ arthas@2081] $ quit
[ root@mysql8 /]
[ root@mysql8 /]
命令使用
基础指令
help:查看命令帮助信息,可以查看当前 arthas 版本支持的指令,或者查看具体指令的使用说明
cat:打印文件内容,和 linux 里的 cat 命令类似。
echo:打印参数,和 linux 里的 echo 命令类似。
grep:类似传统的grep命令,匹配查找
tee:tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
pwd:返回当前的工作目录,和 linux 命令类似
cls:清空当前屏幕区域。注:非终端模式下使用 cls 指令,会提示"Command ‘cls’ is only support tty session."。
session:查看当前会话的信息,显示当前绑定的 pid 以及会话 id。
reset:重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端stop时会重置所有增强过的类
version:输出当前目标 Java 进程所加载的 Arthas 版本号
history:打印命令历史。
quit:退出当前 Arthas 客户端,其他 Arthas 客户端不受影响。等同于exit、logout、q三个指令
stop:关闭 Arthas 服务端,所有 Arthas 客户端全部退出。
keymap:keymap命令输出当前的快捷键映射表:
[ arthas@2299] $ version
3.7 .2
[ arthas@2299] $ pwd
/
[ arthas@2299] $ session
Name Value
--------------------------------------------------
JAVA_PID 2299
SESSION_ID e0bf1234-57b0-478e-920b-08063ccf714b
[ arthas@2299] $ echo 123
123
[ arthas@2299] $ history
1 cd /root/.arthas/lib/3.7.2/arthas
2 jps
.. . .. .
[ arthas@2299] $ stop
Resetting all enhanced classes .. .
Affect( class count: 0 , method count: 0 ) cost in 0 ms, listenerId: 0
Arthas Server is going to shutdown.. .
[ arthas@2299] $ session ( e0bf1234-57b0-478e-920b-08063ccf714b) is closed because server is going to shutdown.
JVM相关
dashboard - 当前系统的实时数据面板
[i:] 刷新实时数据的时间间隔 (ms),默认 5000ms
[n:] 刷新实时数据的次数
getstatic - 查看类的静态属性
heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
jvm - 查看当前 JVM 的信息
logger - 查看和修改 logger
mbean - 查看 Mbean 的信息
memory - 查看 JVM 的内存信息
ognl - 执行 ognl 表达式
perfcounter - 查看当前 JVM 的 Perf Counter 信息
sysenv - 查看 JVM 的环境变量
sysprop - 查看和修改 JVM 的系统属性
thread - 查看当前 JVM 的线程堆栈信息
id 线程 id
[n:] 指定最忙的前 N 个线程并打印堆栈
[b] 找出当前阻塞其他线程的线程
[i ] 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
[–all] 显示所有匹配的线程
vmoption - 查看和修改 JVM 里诊断相关的 option
vmtool - 从 jvm 里查询对象,执行 forceGc
[ arthas@1568] $ dashboard
ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
-1 C2 CompilerThread0 - -1 - 0.0 0.000 0 :0.282 false true
-1 C1 CompilerThread1 - -1 - 0.0 0.000 0 :0.258 false true
-1 VM Periodic Task Thread - -1 - 0.0 0.000 0 :0.150 false true
-1 GC task thread
-1 GC task thread
10 DestroyJavaVM main 5 RUNNABLE 0.0 0.000 0 :0.085 false false
22 arthas-NettyHttpTelnetBootstrap-3 system 5 RUNNABLE 0.0 0.000 0 :0.055 false true
-1 VM Thread - -1 - 0.0 0.000 0 :0.045 false true
11 Attach Listener system 9 RUNNABLE 0.0 0.000 0 :0.021 false true
16 arthas-NettyHttpTelnetBootstrap-3 system 5 RUNNABLE 0.0 0.000 0 :0.017 false true
8 Thread-0 main 5 BLOCKED 0.0 0.000 0 :0.007 false false
Memory used total max usage GC
heap 19M 74M 839M 2.27 % gc.ps_scavenge.count 5
ps_eden_space 1M 30M 301M 0.47 % gc.ps_scavenge.time( ms) 78
ps_survivor_space 0K 2560K 2560K 0.00 % gc.ps_marksweep.count 1
ps_old_gen 17M 41M 629M 2.80 % gc.ps_marksweep.time( ms) 39
nonheap 27M 28M -1 97.60 %
code_cache 4M 4M 240M 1.83 %
metaspace 20M 21M -1 97.59 %
Runtime
os.name Linux
os.version 3.10 .0-1160.el7.x86_64
java.version 1.8 .0_411
java.home /usr/local/jdk1.8.0_411/jre
systemload.average 0.00
processors 2
[ arthas@2299] $ thread
Threads Total: 22 , NEW: 0 , RUNNABLE: 8 , BLOCKED: 2 , WAITING: 3 , TIMED_WAITING: 2 , TERMINATED: 0 , Internal threads: 7
ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
46 arthas-command-execute system 5 RUNNABLE 0.18 0.000 0 :0.002 false true
-1 VM Periodic Task Thread - -1 - 0.12 0.000 0 :0.230 false true
-1 C1 CompilerThread1 - -1 - 0.05 0.000 0 :0.406 false true
-1 C2 CompilerThread0 - -1 - 0.0 0.000 0 :0.442 false true
2 Reference Handler system 10 WAITING 0.0 0.000 0 :0.001 false
[ arthas@2299] $ heapdump /tmp/OOMTest.hprof
Dumping heap to /tmp/OOMTest.hprof .. .
Heap dump file created
class/classloader相关
classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
dump - dump 已加载类的 byte code 到特定目录
jad - 反编译指定已加载类的源码
mc - 内存编译器,内存编译.java文件为.class文件
redefine - 加载外部的.class文件,redefine 到 JVM 里
retransform - 加载外部的.class文件,retransform 到 JVM 里
sc - 查看 JVM 已加载的类信息
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。 如果一个类被多个 ClassLoader 所加载,则会出现多次
[E] 开启正则表达式匹配,默认为通配符匹配
[f] 输出当前类的成员变量信息(需要配合参数-d 一起使用)
[x:] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)
[cs ] 指定 class 的 ClassLoader#toString() 返回值。长格式[classLoaderStr ]
sm - 查看已加载类的方法信息
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 展示每个方法的详细信息
[E] 开启正则表达式匹配,默认为通配符匹配
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)
monitor/watch/trace相关
monitor - 方法执行监控
stack - 输出当前方法被调用的调用路径
trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
watch - 方法执行数据观测
其它
profiler - 使用async-profiler对应用采样,生成火焰图
官方文档