Arthas 是阿里巴巴开源的一款 Java 诊断工具,特别适合用来排查和诊断线上问题。它支持多种功能,例如方法跟踪、内存分析、线程诊断等,是解决线上故障的一把利器。Arthas 通过命令行界面与用户交互,可以方便地对运行中的 Java 进程进行实时监控和调试,而无需停止进程。
Arthas 功能
Arthas 提供以下主要功能:
- Class 相关
- classloader:查看 ClassLoader 的结构及类的加载情况。
- jad:反编译指定的类,直接查看源代码。
- mc:列出方法调用的详细信息。
- sc:查看当前 JVM 加载的所有类及其相关信息。
- Thread 相关
- thread:查看当前线程的堆栈信息、线程状态。
- JVM 监控
- dashboard:显示当前 JVM 的 CPU、内存等实时信息。
- heapdump:生成堆内存快照用于分析内存问题。
- Monitor 和 Tracing
- trace:方法调用跟踪,查看某个方法的详细执行情况,及调用链信息。
- watch:监听并打印方法调用的输入输出和返回值。
- monitor:监控某个方法的性能指标,如每秒调用次数、平均耗时等。
Arthas 的使用场景
- 定位方法执行异常:通过 trace、watch 等命令,可以跟踪方法执行过程,找出潜在的性能瓶颈或者业务逻辑错误。
- 线程问题排查:通过 thread 命令,可以查看系统中各个线程的状态,定位死锁、阻塞等问题。
- 类加载问题排查:classloader 和 jad 命令可以帮助你查看类加载器以及类的具体实现,便于调试类冲突、类加载异常等问题。
- 内存问题诊断:通过 heapdump、dashboard 等命令查看 JVM 内存使用情况,定位内存泄露问题。
Arthas 安装与启动
1. 快速安装
方式一:自动安装
你可以使用以下一行命令来安装和启动 Arthas:
curl -L https://arthas.aliyun.com/arthas-boot.jar -o arthas-boot.jar
java -jar arthas-boot.jar
方式二:手动下载
也可以手动从官网下载 arthas-boot.jar,然后使用 java -jar 启动。
2. 启动 Arthas
启动成功后,会显示当前机器上的所有 Java 进程,类似如下:
[INFO] Arthas script version: 3.5.4
[INFO] Process list:
* [1]: 1268 com.example.demo.DemoApplication
[2]: 1279 com.example.AnotherApp
1. Please select a process
你可以输入数字选择你要诊断的 Java 进程。选择后,会进入 Arthas 命令行界面。
3. Arthas 常用命令
1. dashboard:查看系统实时性能信息
该命令用于查看 JVM 的实时数据,如线程数、内存使用、GC 情况等。
dashboard
输出示例:
$ dashboard
ID NAME GROUP PRIOR STATE %CPU TIME INTERRUPTED DAEMON
34 Monitor Ctrl-Break main 5 RUNNABLE 0.00 0:00 false true
35 Reference Handler system 10 TIMED_WAITING 0.00 0:00 false true
36 Finalizer system 8 WAITING 0.00 0:00 false true
...
Memory: heap 330M, nonheap 45M, max heap 1600M, permgen 0M
GC: copy 7/7ms, mark sweep 7/11ms
2. thread:线程诊断
显示当前 JVM 中所有线程的信息,包括线程栈、状态、CPU 使用率等。可以用于排查死锁、线程阻塞等问题。
thread
你还可以查看某个特定线程的堆栈:
thread 1
3. sc:查看已加载的类信息
sc -d org.example.DemoService
输出示例:
class-info org.example.DemoService
code-source /path/to/jar/demo.jar
name org.example.DemoService
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name DemoService
modifier public
interfaces [java.io.Serializable]
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@18b4aac2
classLoaderHash 18b4aac2
4. trace:方法执行耗时跟踪
trace 命令用于跟踪某个方法的执行情况,输出该方法执行的耗时和调用链信息,适用于排查性能瓶颈。命令格式如下:
trace org.example.DemoService sayHello
输出示例:
Press Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 36 ms, listenerId: 1
`---ts=2024-10-21 12:34:56;thread_name=main;id=1;is_daemon=true;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@18b4aac2
`---[29.536ms] org.example.DemoService.sayHello()
5. watch:方法调用输入输出监控
watch 命令用于监控方法的输入参数、返回值和异常信息。例如,你想查看 sayHello 方法的返回值,可以使用如下命令:
watch org.example.DemoService sayHello returnObj
输出示例:
Press Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 46 ms, listenerId: 1
ts=2024-10-21 12:34:56; [cost=0.0721ms] result=@String[Hello Arthas]
6. jad:反编译指定类
jad 命令用于反编译 JVM 加载的类,查看其源代码。命令格式如下:
jad org.example.DemoService
输出示例:
// class version 52.0 (52)
// access flags 0x21
public class org.example.DemoService {
public org.example.DemoService();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello Arthas
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
7. heapdump:生成堆内存快照
当你怀疑内存泄漏或其他内存相关问题时,可以使用 heapdump 命令来生成堆快照进行分析。
heapdump
结束 Arthas 会话
在 Arthas 命令行下输入 exit,即可退出当前会话。
总结
Arthas 提供了丰富的命令来解决 JVM 应用中的各种问题,从性能监控、线程分析到内存诊断等。通过合理使用这些命令,能够快速有效地解决 Java 应用中的各种疑难杂症。