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
。
好啦,松哥就和大家介绍这么多,当然这个插件还可以生成更多命令,这就需要小伙伴去一一探索了。
微服务项目实战
松哥最近把 AI 面试官项目改造成了微服务,并且录制了配套的视频课程。这次真的是 Buff 叠满:
Spring Boot3 + Vue3 + 微信小程序 AI 微服务项目
手把手带领小伙伴们做一个 AI 面试官微服务项目。
并且我在这个课程中也会和大家分享如何在简历中写微服务项目以及如何跟面试官去讲自己的微服务项目,让简历更靓。
下面我以问答的形式向小伙伴们介绍下微服务版的 AI 面试官项目。
项目介绍
项目技术栈是什么?
AI 面试官项目采用 Spring Boot3 + Vue3 + uni-app 实现,微服务版基于脚手架完成,涉及到的组件有 Nacos、Gateway、OpenFeign 等。 其他的技术细节采用了如 MyBatis-Plus、Redis 等等。
课程内容有哪些?
课程分为了四大部分,前三部分是项目的主体内容,第四部分是项目的赠送内容:
第一部分是 AI 面试官项目主体,这块我会带领大家手把手开发 AI 面试官项目的后台管理功能和小程序功能,这一阶段的工作完成后,大家的小程序就可以部署上线了,这一阶段大概 13 小时左右。 第二部分我会和大家一起拆解目前市面上主流的微服务项目脚手架,这一阶段通过对项目架构的分析,让大伙不再觉得微服务是一个高大上的东西,微服务项目是一个人人都可以快速掌握的东西。这一部分大约两小时。 第三部分我会对前面第一部分已经完成的 AI 面试官项目进行微服务化改造,让大家在理解微服务脚手架的基础之上,真正实践一次微服务。这一部分大约两小时。 第四部分是赠送给大家的,和大家聊一聊目前比较火的 AI 智能体,带领小伙伴们亲手实践几个 AI 智能体,这一部分大约是两小时。
课程适合谁学?
如果你已经把微服务各个组件掌握的滚瓜烂熟,但是却从没做过微服务项目; 如果你想拥抱 AI 但是却只会把 AI 当搜索引擎使用; 如果你想把 Java 和 AI 结合起来做个小玩意但是却无从下手; 如果你想体验一把 Spring Boot3+Vue3 的最新玩法; 那么这个项目适合你。
课程不适合谁学?
如果没有 Java 基础,或者不会 SSM 框架,那么不建议学习这个项目。
我学习过程中遇到问题怎么办?
这个课程松哥提供了微信答疑群,所有课程相关的问题,都可以发到群里讨论,我也都会回复的。
课程只有视频资料吗?
这个课程除了视频之外,还有配套的笔记和代码案例,会一同给到大家。
课程会教小程序上线吗?
会教如何上线小程序,包括小程序审核需要注意的问题,都会发到群里,尽力确保每位小伙伴做完的项目都能成功上线。
小程序做出来是什么样子的?
我能不能先看下课程目录?
关于松哥
9 年程序员生涯,Java 畅销书作者,华为云最具价值专家,华为开发者社区之星,GitHub 知名项目作者。
目前产品有 Java 项目课程、Java 简历指导、1V1 模拟面试等,如有需求欢迎来勾搭。
感兴趣小伙伴加微信备注 ai
课程目前售价 499,感兴趣小伙伴加松哥微信备注 ai。