头图

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

好啦,松哥就和大家介绍这么多,当然这个插件还可以生成更多命令,这就需要小伙伴去一一探索了。


江南一点雨
9.1k 声望7.6k 粉丝

《Spring Boot+Vue全栈开发实战》作者