Arthas 是一款阿里巴巴开源的 Java 诊断工具,可以帮助开发人员更加方便地进行 Java 应用的在线诊断。
Arthas 提供了一系列强大的命令,可以用于分析线程状态、监控方法调用、查看 JVM 信息、追踪慢 SQL 等多种用途。
Arthas 的目标是让 Java 开发人员能够快速定位问题,提高故障排查的效率。
相比于其他一些 Java 诊断工具,Arthas 主要有如下一些优势:
-
轻量级:Arthas 可以在不停止应用的情况下附着到目标 JVM 上,进行在线诊断。
-
易用性:Arthas 提供了一系列简单易懂的命令行工具,使得故障排查变得更加直观。
-
功能丰富:Arthas 提供了多种功能,包括但不限于方法跟踪、JVM 信息查看、线程状态分析等。
对于新手来说,老是记不住 Arthas 命令~今天松哥就给大家介绍一下 IDEA 中 Arthas 插件的玩法,用插件可以自动生成 Arthas 命令。
这个插件主要是用来生成 Arthas 命令的。
一 安装
直接在 IDEA 的插件市场搜索 Arthas,第一个就是:
点击安装,装好之后重启一下。
二 实践
我先说一句,一些基础的命令,像 thread、jvm、dashboard 等等,这些虽然插件也能生成,但是这些命令我建议自己敲更快更省事。
2.1 准备测试项目
首先我先创建一个 Spring Boot 项目,启动方法里边加一段简单的代码如下:
@SpringBootApplication
public class ArthasDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ArthasDemoApplication.class, args);
new Thread(() -> {
while (true) {
System.out.println(new Date());
}
},"javaboy-t").start();
}
}
一个子线程,然后在一个死循环里边打印日志。
启动这个项目。
2.2 启动 Arthas
接下来我们启动 Arthas。
启动之后这里会展示出来当前系统中的 Java 进程。
我们的项目是第二个,根据提示输入 2 然后按回车即可:
2.3 查看线程运行情况
进入到 Arthas 控制台之后,先输入 thread 可以查看我们项目中各个线程的运行情况:
可以看到,这个 ID 为 40 的线程快把 CPU 拉满了,而且我们也能够看到,这个线程的名字就是我们自己取的 javaboy-t。
继续通过 thread 40 查看这个线程的情况:
可以看到,问题出在代码第 15 行。
2.4 生成反编译指令
由于我们 Arthas 一般检查的都是在线运行的项目,并且也找到了问题出现的类,那么这个时候就可以通过反编译指令来查看具体的问题。
我们在 IDEA 中找到出问题的类,选择 Arthas Command->Decompile Class Jad。
此时会自动生成指令 jad --source-only org.javaboy.arthas_demo.ArthasDemoApplication
,将之拷贝到 Arthas 控制台去执行。
可以看到,生成的代码中标记了出问题的代码,第 15 行都给标记出来了。
2.5 生成查看方法执行时间指令
有时候我们有个接口运行很慢,我们需要定位问题出在哪一步?利用 Arthas 的 trace 命令可以做到。
假设我的接口代码如下:
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public String hello() {
return helloService.hello();
}
}
对应的 HelloService 则如下:
@Service
public class HelloService {
public String hello() {
try {
m1();
m2();
m3();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "hello";
}
private void m3() throws InterruptedException {
Thread.sleep(3000);
}
private void m2() throws InterruptedException {
Thread.sleep(2000);
}
private void m1() throws InterruptedException {
Thread.sleep(1000);
}
}
这个时候,我们想要查看 hello 接口为什么慢,鼠标放在接口方法名上,然后选择 Arthas Command -> Trace,就可以生成指令:
生成的指令如下 trace org.javaboy.arthas_demo.controller.HelloController hello -n 5 --skipJDKMethod false
。
-n 5
这个参数表示这个命令会执行 5 次,也就是会监测五次请求这个接口的耗时。skipJDKMethod 参数为 false 则表示 Arthas 不会去跟踪 JDK 方法的执行耗时,这个设置可以用来提升性能。
将这个指令拷贝到 Arthas 控制台,我们就能够清晰的查看方法的执行耗时:
能够看到,HelloSerivce#hello 方法执行耗时 6 秒。
2.6 生成查看方法调用栈指令
比如我们想查看 m3 方法执行的堆栈信息,那么点击 Arthas Commands -> Stack,就可以生成相关指令:
生成的指令是这样 stack org.javaboy.arthas_demo.service.HelloService m3 -n 5
。
执行之后结果如下:
2.7 生成查看方法参数指令
如果希望能够监控到方法执行的参数指令,如下:
生成的指令是这样:watch org.javaboy.arthas_demo.controller.HelloController hello '{params,returnObj,throwExp}' -n 5 -x 3
。
这个 -x 3
表示遍历的深度为 3,这个参数可以调整来打印具体的参数和结果内容,默认值是 1,最大是 4。
大家看到输出结果是一个 result 数组,数组中包含三项,分别是方法参数、返回值以及异常。
2.8 生成方法监控指令
方法监控指令可以查看方法执行调用次数、成功次数、失败次数、平均 RT 以及方法执行失败率等。
生成的指令是这样:monitor org.javaboy.arthas_demo.controller.HelloController * -n 10 --cycle 10
。cycle 参数表示统计周期,这里是 10s 一次。
大家可以看到输出日志中的时间戳,间隔都是 10s。
2.9 生成查看类静态属性指令
通过 getstatic 命令可以方便的查看类的静态属性。
生成的指令是这样 getstatic org.javaboy.arthas_demo.service.HelloService list -x 3
。
2.10 生成 ongl 指令
执行 ognl 表达式也可以用来查看静态表达式,而且更加灵活。
首先获取 ClassLoaderHash,如下:
对应的命令是这样的 sc -d org.javaboy.arthas_demo.service.HelloService
。
然后继续:
填入刚刚生成的 Hash 值:
生成的命令是这样 ognl -x 3 '@org.javaboy.arthas_demo.service.HelloService@list' -c 251a69d7
。
2.11 生成监控实例变量指令
第一步同 2.10 小结,先拿到 hash 值。
接下来如下:
填入 hash 值:
生成的指令是这样 vmtool -x 3 --action getInstances --className org.javaboy.arthas_demo.service.HelloService --express 'instances[0].list' -c 251a69d7
。