1. 简介

Alibaba Arthas 是一款强大的 Java 应用诊断工具,支持在线监控、性能分析和问题排查。它的最大优势在于 无需修改代码,也无需重启目标服务,即可对正在运行的 Java 进程进行实时诊断。

本文将从 Arthas 的安装入手,通过一个实际案例,带你快速掌握其核心功能的使用。由于 Arthas 本身是用 Java 编写的,因此具备良好的跨平台能力,可无缝运行于 Linux、macOS 和 Windows 系统。

2. 下载与启动

首先,通过以下任一方式下载 Arthas 启动包:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

下载完成后,通过 -h 参数验证安装是否成功:

java -jar arthas-boot.jar -h

如果一切正常,你将看到完整的命令帮助信息:

baeldung arthas help command

3. 案例准备

为了演示 Arthas 的功能,我们准备了一个简单的应用,它使用递归方式实现了一个效率较低的 斐波那契数列 计算:

public class FibonacciGenerator {

    public static void main(String[] args) throws Exception {
        System.out.println("按任意键开始...");
        System.in.read();
        for (int i = 0; i < 100; i++) {
            long result = fibonacci(i);
            System.out.println(String.format("fib(%d): %d", i, result));
        }
    }

    public static long fibonacci(int n) {
        if (n == 0 || n == 1) {
            return 1L;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

这个例子的“坑”在于 fibonacci 方法的递归实现,时间复杂度极高。在 main 方法中,我们使用一个较大的循环来制造明显的 CPU 消耗,这正是我们用来演示 Arthas 诊断能力的理想场景。

4. 启动 Arthas

  1. 先启动目标应用:在 IDE 或终端中运行 FibonacciGenerator,它会暂停等待输入。
  2. 启动 Arthas:在另一个终端执行:
java -jar arthas-boot.jar

Arthas 会列出当前机器上所有可被诊断的 Java 进程,提示你选择目标:

[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 25500 com.baeldung.arthas.FibonacciGenerator
...

输入对应序号(如 1)并回车,Arthas 即可成功 attach 到目标进程:

[INFO] Try to attach process 25500
[INFO] Attach process 25500 success.
...

此时,你已进入 Arthas 命令行界面,可以开始输入各种诊断命令。
✅ 支持 Tab 键自动补全,提升操作效率。

现在,回到应用的终端,按任意键让程序继续运行,它将开始疯狂计算斐波那契数列。

5. 仪表盘(Dashboard)

在 Arthas 命令行中输入 dashboard,即可查看一个实时更新的系统概览面板:

baeldung arthas dashboar

关键信息一览:

  • 线程区(Top):展示所有线程状态,重点关注 main 线程的 CPU 占用率。
  • 内存区(Memory):显示堆内存各区域(Eden, Survivor, Old 等)的使用情况和 GC 信息。
  • JVM 信息区:包含 JVM 版本、运行参数、系统负载等。

⚠️ 退出方式:按 q 键可退出仪表盘,但 Arthas 仍附着在进程上。
彻底退出:必须执行 stop 命令来断开连接,避免资源泄漏。

6. 分析线程栈(Stack Trace)

dashboard 中我们观察到 main 线程几乎占用了 100% 的 CPU。它的线程 ID 通常是 1。

退出仪表盘后,使用 thread 命令深入分析:

thread 1

输出将是一个巨大的、充满 fibonacci 方法调用的栈跟踪。

如果栈太深,可以结合管道和 grep 进行过滤:

thread 1 | grep 'main('

输出结果将精确定位到问题代码行:

[arthas@25500]$ thread 1 | grep 'main('
    at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)

7. 反编译类(Decompile)

想象一下,你正在诊断一个没有源码的应用,发现线程栈里全是 fibonacci 的调用。这时,Arthas 的反编译功能就派上用场了。

使用 jad 命令,传入类的全限定名:

jad com.baeldung.arthas.FibonacciGenerator

输出结果包含:

/*
 * Decompiled with CFR.
 */
package com.baeldung.arthas;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

public class FibonacciGenerator {
    public static void main(String[] arrstring) throws IOException {

这招在排查第三方依赖或线上问题时非常实用,可以直接看到类的内部实现,连同类加载器和物理路径等元信息。

8. 搜索类与方法(Search Class & Method)

当面对一个复杂的系统时,快速定位类和方法是关键。

  • 搜索类(sc):使用通配符查找已加载的类。
[arthas@70099]$ sc *Fibonacci*
com.baeldung.arthas.FibonacciGenerator
Affect(row-cnt:1) cost in 5 ms.
  • 查看类详情:使用 -d-f 标志。
[arthas@70099]$ sc -df com.baeldung.arthas.FibonacciGenerator
  class-info        com.baeldung.arthas.FibonacciGenerator
  ...
  • 搜索方法(sm):查找类中定义的方法。
[arthas@70099]$ sm com.baeldung.arthas.FibonacciGenerator
com.baeldung.arthas.FibonacciGenerator <init>()V
com.baeldung.arthas.FibonacciGenerator main([Ljava/lang/String;)V
com.baeldung.arthas.FibonacciGenerator fibonacci(I)J
Affect(row-cnt:3) cost in 4 ms.
  • 查看方法详情:结合 -d 标志和方法名。
sm -d com.baeldung.arthas.FibonacciGenerator fibonacci
 declaring-class  com.baeldung.arthas.FibonacciGenerator
 method-name      fibonacci
 modifier         public,static
 annotation
 parameters       int
 return           long
 exceptions
 classLoaderHash  799f7e29

9. 监控方法调用(Monitor)

排查性能问题时,监控方法的调用频率和耗时至关重要。

使用 monitor 命令,每 10 秒输出一次 fibonacci 方法的统计信息:

monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci

输出示例:

Affect(class-cnt:1 , method-cnt:1) cost in 47 ms.
 timestamp            class                                          method     total   success  fail  avg-rt(ms)  fail-rate                                                                       
-----------------------------------------------------------------------------------------------------------------------------                                                                      
 2020-03-07 11:43:26  com.baeldung.arthas.FibonacciGenerator  fibonacci  528957  528957   0     0.07        0.00%
...

✅ **avg-rt(ms)**:平均响应时间,是性能分析的核心指标。
✅ **fail-rate**:失败率,帮助快速发现异常。

10. 监控方法参数与返回值(Watch)

如果需要查看方法执行时的入参和返回值,watch 命令是不二之选。它的语法基于 OGNL 表达式,稍显复杂但功能强大。

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10

参数解析:

  • com.baeldung.arthas.FibonacciGenerator:类名
  • fibonacci:方法名
  • '{params[0], returnObj}':OGNL 表达式,定义要观察的内容(第一个参数和返回对象)
  • 'params[0]>10':条件表达式,仅当参数大于 10 时才触发监控
  • -n 10:最多输出 10 次结果

执行后,你将看到类似输出:

Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 19 ms.
ts=2020-02-17 21:48:08; [cost=30.165211ms] result=@ArrayList[
    @Integer[11],
    @Long[144],
]
ts=2020-02-17 21:48:08; [cost=50.405506ms] result=@ArrayList[
    @Integer[12],
    @Long[233],
]
...

这招在复现线上 bug 时非常有效,能清晰看到输入输出和执行耗时。

11. 性能剖析(Profiler)

对于想直观了解 CPU 资源消耗的场景,profiler 命令生成的火焰图(FlameGraph)是神器。

  1. 启动性能采样:
profiler start
  1. (可选)查看采样进度:
profiler getSamples
  1. 停止采样并生成火焰图:
profiler stop

生成的火焰图清晰地展示了 fibonacci 方法的调用栈深度和 CPU 占用:

baeldung flame graph arthas

火焰图的宽度代表 CPU 时间,越宽的函数消耗越多。一眼就能定位性能瓶颈。

12. 总结

本文通过一个简单的案例,演示了 Alibaba Arthas 的核心功能:从进程附着、实时监控、反编译,到方法参数观察和火焰图性能剖析。

Arthas 的强大之处在于其 “无侵入” 的特性,特别适合在生产环境或无法获取源码的情况下进行快速诊断。对于有经验的开发者而言,它是一个不可或缺的线上问题排查利器。

文中示例的完整代码可在 GitHub 获取:https://github.com/eugenp/tutorials/tree/master/libraries-3


原始标题:Introduction to Alibaba Arthas | Baeldung