在日常 Java 开发中,我们经常会遇到线上问题难以重现、日志信息不足、重启成本高昂等棘手情况。为了解决这些问题,阿里巴巴开源了强大的诊断工具——Arthas。它可以在 不重启、不改代码、不侵入业务 的前提下,对运行中的 Java 应用进行实时排查与分析。本文将通过实战演示,带你从零上手 Arthas,并掌握其核心功能,提升线上故障的定位效率。
文章目录
1、Arthas 的介绍
Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,用于排查线上 Java 应用的运行问题,特别适合运行中的生产环境,不用重启、不用修改代码。深受开发者喜爱。
Arthas 的特点:
- 支持在 无侵入、热插拔 的情况下,对 Java 应用进行诊断。
- 支持查看方法调用、JVM 状态、线程、内存、class 加载、反编译等。
- 命令行交互,直观方便。
2、Arthas 的安装和运行
Arthas 的确是一个轻量的 Java 诊断工具,使用起来非常简单,因为它本身就是一个 Jar 文件,我们只需要将它下载之后使用 Java 运行 Jar 文件即可。
2.1、下载
下载地址(可以通过浏览器下载):https://alibaba.github.io/arthas/arthas-boot.jar
使用命令下载即可(Windows 使用 cmd 窗口):
curl -O https://arthas.aliyun.com/arthas-boot.jar
2.2、运行
运行上,我们通过 java -jar
的方式运行即可(需提前配置好 Java 环境):
java -jar arthas-boot.jar
Ps:如果发现程序自动停止了,这可能因为它找不到运行的 Java 进程。这个 Jar 文件需要当前环境下有 Java 进程运行才能启动
3、Arthas 的应用案例
3.1、新建演示项目
这里我们使用 Idea 新建一个简单的 SpringBoot 演示项目。
示例结构:
demo-arthas/
├── DemoApplication.java
├── service/
│ └── HelloService.java
└── controller/
└── HelloController.java
类:DemoApplication.java
package com.lizhengi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ArthasDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ArthasDemoApplication.class, args);
}
}
类:HelloService
package com.lizhengi.service;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
public String greet(String name) {
String result = "Hello, " + name;
System.out.println("[HelloService] result: " + result);
return result;
}
}
类:DemoApplication.java
package com.lizhengi.controller;
import com.lizhengi.service.HelloService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
private final HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "World") String name) {
return helloService.greet(name);
}
}
3.2、启动演示项目
接下来我们直接运行 ArthasDemoApplication
类,启动项目:
3.3、Arthas attach 进程
Arthas 选择监控的进程,一般是在启动时进行的
我们这里执行一下启动命令:
java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999
其中 --telnet-port
和 --http-port
分别是 用来建立 Telnet 控制台连接的端口 和 来建立 HTTP 控制台连接的端口。这里之所以制定,是因为我们的项目采用 Idea 启动,他的默认端口 8563 会和 Idea 对进程的监听端口起冲突。
启动进程后我们需要输入我们要 attach 进程的 PID,从下图可以看出 ArthasDemoApplication 进程 PID 为数字 1:
3.4、Arthas 调试 Service 的方法
这里我们用一条来实时观察 Service 方法的调用:
watch com.example.demo.service.HelloService greet '{params, returnObj}' -x 3
其中:
watch
: Arthas 的命令之一,用于观察某个类的方法执行情况com.example.demo.service.HelloService
: 目标类的全限定名,表示你要观察这个类中的方法greet
: 要观察的方法名(这个方法可以带参数)'{params, returnObj, cost}'
: 表示要输出的内容(我们马上详细讲)-x 3
: 输出的对象最大展开层级(打印对象时的深度,3层更详细)
输出内容说明:
params
: 方法入参,是一个数组,表示调用时传入的参数returnObj
: 方法返回值
接下来,我们调用 Controller 接口,Arthas 就会自动打印出我们所需要的值。
[arthas@11735]$ watch com.lizhengi.service.HelloService greet '{params, returnObj}' -x 3
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 31 ms, listenerId: 7
method=com.lizhengi.service.HelloService.greet location=AtExit
ts=2025-04-09 09:16:32.240; [cost=0.135763ms] result=@ArrayList[
@Object[][
@String[World],
],
@String[Hello, World],
]
这里可以看到 watch
成功观察到了 greet("World")
方法的调用,打印出了参数和返回值。
4、Arthas 的功能总览
4.1、进程相关
命令 | 作用简介 | |
---|---|---|
ps |
查看当前所有 Java 进程 | |
attach |
附加到指定 Java 进程(arthas-boot 会自动引导) |
4.2、监控和诊断
命令 | 作用 |
---|---|
dashboard |
实时查看系统概况(CPU/内存/GC) |
thread |
查看线程状态,排查死锁、CPU飙升 |
monitor |
周期性监控方法的执行耗时(统计型) |
watch |
观察方法调用(参数、返回值、耗时) |
trace |
跟踪方法执行路径及每一层耗时 |
stack |
打印方法调用的栈轨迹 |
tt |
方法调用快照(可查询历史调用结果) |
sc |
查看类信息(支持搜索) |
sm |
查看类的方法签名(支持搜索) |
jad |
反编译指定类 |
mc |
将内存中的类 dump 成 .class 文件 |
redefine |
热更新 class 文件 |
ognl |
执行任意 OGNL 表达式,调对象属性、调用方法 |
heapdump |
导出堆快照(.hprof)用于内存分析 |
vmoption |
查看或修改 JVM 运行参数 |
getstatic |
获取类的静态字段 |
perfcounter |
打印 JVM 性能计数器(类似 JMX 指标) |
sysprop |
查看/修改系统属性 |
sysenv |
查看系统环境变量 |
4.3、类 & 字节码操作
命令 | 作用 |
---|---|
sc |
搜索类(全限定名或关键字) |
sm |
查看类的方法 |
jad |
反编译类 |
mc |
dump 字节码 |
redefine |
热加载类 |
4.4、高级调试 / 试验场
命令 | 说明 |
---|---|
tt |
记录方法调用快照(trace time) |
tt -i |
查看某条历史调用详情 |
ognl |
动态执行 Java 表达式,调对象属性、方法 |
watch |
实时观察方法执行细节(推荐) |
trace |
方法内部每一层调用及耗时 |
stack |
打印调用堆栈 |
4.5、基础工具命令
命令 | 说明 |
---|---|
help |
查看帮助信息 |
cls |
清屏 |
quit / exit |
退出 Arthas |
reset |
清除所有已注册的监听器 |
history |
查看历史命令 |
5、Arthas 常用命令组合(新手/排查问题必备)
场景 | 推荐命令组合 |
---|---|
方法是否被调用? | watch / monitor |
谁调了这个方法? | trace / stack |
CPU 飙高排查? | dashboard → thread |
线程死锁? | thread -n 5 |
类加载路径? | sc / classloader |
反编译看源码? | jad |
热更新 class? | redefine |
内存泄漏排查? | heapdump |
X、后记
Arthas 的强大不仅仅在于它覆盖了 JVM 诊断的几乎所有方面,更在于它“开箱即用、无侵入式”的设计理念,让开发者可以专注于排查和修复问题。通过本篇文章的学习,相信你已经掌握了如何使用 Arthas 来调试 Spring Boot 项目中的方法调用、查看 JVM 状态以及常见性能瓶颈的分析。建议大家在开发阶段就熟练掌握 Arthas,为未来的线上运维打下坚实基础。