前言
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
一,Arthas 安装
官方文档:https://arthas.aliyun.com/doc/quick-start.html
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
二,常用命令
官方文档:https://arthas.aliyun.com/doc/commands.html
monitor/watch/trace 相关
- monitor - 方法执行监控(统计方法成功、失败调用次数、平均响应时间)
- stack - 输出当前方法被调用的调用路径
- trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
- tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
- watch - 方法执行数据观测
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 已加载的类信息
- sm - 查看已加载类的方法信息
JVM 相关
-
dashboard - 当前系统的实时数据面板,如线程、内存及系统参数等信息
-
getstatic - 查看类的静态属性
-
heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
-
- heapdump /tmp/dump.hprof:dump 到指定文件;
- heapdump --live /tmp/dump.hprof:只dump 存活的对象;
-
jvm - 查看当前 JVM 的信息
-
logger - 查看和修改 logger
-
mbean - 查看 Mbean 的信息
-
memory - 查看 JVM 的内存信息
-
ognl - 执行 ognl 表达式
-
perfcounter - 查看当前 JVM 的 Perf Counter 信息
-
sysenv - 查看 JVM 的环境变量
-
sysprop - 查看和修改 JVM 的系统属性
-
thread - 查看当前 JVM 的线程堆栈信息
-
- thread -n 3:指定最忙的前 N 个线程并打印堆栈;
- thread -b:找出当前阻塞其他线程的线程;
- thread id:显示指定线程的运行堆栈;
-
vmoption - 查看和修改 JVM 里诊断相关的 option
-
vmtool - 从 jvm 里查询对象,执行 forceGc
三,热更新代码
3.1,jad反编译目标类,并完成修改编辑
反编译目标类,生成文件放到 /tmp 文件夹下,新开一个 Terminal 窗口进行修改并保存。
# 示例 指定目标类为 UserController
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
编辑后保存最新代码!
3.2,mc 编译目标类
保存好 /tmp/UserController.java之后,使用 mc(Memory Compiler)命令来编译,并且通过-c或者–classLoaderClass参数指定ClassLoader:
# 示例 指定目标类为UserController
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
# 输出
# Memory compiler output:
# /tmp/com/example/demo/arthas/user/UserController.class !重要,下一步用到
# Affect(row-cnt:1) cost in 2879 ms.
重要:记录编译后输出的目标类路径,下一步用到!
3.3,redefine 重新加载
再使用redefine命令重新加载新编译好目标类class文件:
# 示例 指定目标类为UserController
redefine /tmp/com/example/demo/arthas/user/UserController.class
再次访问接口检查代码是否已更新。
评论区