Arthas命令太难记了?安利一个IDEA插件!

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

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值