1. 简介
Alibaba Arthas 是一款强大的 Java 应用诊断工具,支持在线监控、性能分析和问题排查。它的最大优势在于 无需修改代码,也无需重启目标服务,即可对正在运行的 Java 进程进行实时诊断。
本文将从 Arthas 的安装入手,通过一个实际案例,带你快速掌握其核心功能的使用。由于 Arthas 本身是用 Java 编写的,因此具备良好的跨平台能力,可无缝运行于 Linux、macOS 和 Windows 系统。
2. 下载与启动
首先,通过以下任一方式下载 Arthas 启动包:
- 直接访问 下载链接
- 使用
curl
命令下载:
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
下载完成后,通过 -h
参数验证安装是否成功:
java -jar arthas-boot.jar -h
如果一切正常,你将看到完整的命令帮助信息:
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
- 先启动目标应用:在 IDE 或终端中运行
FibonacciGenerator
,它会暂停等待输入。 - 启动 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
,即可查看一个实时更新的系统概览面板:
关键信息一览:
- ✅ 线程区(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)是神器。
- 启动性能采样:
profiler start
- (可选)查看采样进度:
profiler getSamples
- 停止采样并生成火焰图:
profiler stop
生成的火焰图清晰地展示了 fibonacci
方法的调用栈深度和 CPU 占用:
✅ 火焰图的宽度代表 CPU 时间,越宽的函数消耗越多。一眼就能定位性能瓶颈。
12. 总结
本文通过一个简单的案例,演示了 Alibaba Arthas 的核心功能:从进程附着、实时监控、反编译,到方法参数观察和火焰图性能剖析。
Arthas 的强大之处在于其 “无侵入” 的特性,特别适合在生产环境或无法获取源码的情况下进行快速诊断。对于有经验的开发者而言,它是一个不可或缺的线上问题排查利器。
文中示例的完整代码可在 GitHub 获取:https://github.com/eugenp/tutorials/tree/master/libraries-3