Arthas 快速上手与实战指南:Java 线上诊断利器全解析

在日常 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 

image-20250408174318206

Ps:如果发现程序自动停止了,这可能因为它找不到运行的 Java 进程。这个 Jar 文件需要当前环境下有 Java 进程运行才能启动


3、Arthas 的应用案例

3.1、新建演示项目

这里我们使用 Idea 新建一个简单的 SpringBoot 演示项目。

image-20250408174944037

示例结构:

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 类,启动项目:

image-20250408175745113

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 对进程的监听端口起冲突。

image-20250408181112716

启动进程后我们需要输入我们要 attach 进程的 PID,从下图可以看出 ArthasDemoApplication 进程 PID 为数字 1:

image-20250408181642533

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 飙高排查? dashboardthread
线程死锁? thread -n 5
类加载路径? sc / classloader
反编译看源码? jad
热更新 class? redefine
内存泄漏排查? heapdump

X、后记

Arthas 的强大不仅仅在于它覆盖了 JVM 诊断的几乎所有方面,更在于它“开箱即用、无侵入式”的设计理念,让开发者可以专注于排查和修复问题。通过本篇文章的学习,相信你已经掌握了如何使用 Arthas 来调试 Spring Boot 项目中的方法调用、查看 JVM 状态以及常见性能瓶颈的分析。建议大家在开发阶段就熟练掌握 Arthas,为未来的线上运维打下坚实基础。