# Arthas 必知必会

Arthas 是阿里巴巴开源的一个强大的 Java 诊断工具,它为开发者提供了实时调试和诊断 Java 程序的能力,特别是在生产环境下。它允许你在不重启应用的情况下监控和排查问题。下面是 Arthas 的一些常见用法:

# Arthas 安装

# 下载 Arthas

你可以直接使用以下命令下载 Arthas:

curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启动 Arthas

进入 Java 应用的主目录,执行以下命令启动:

java -jar arthas-boot.jar

# 连接到 JVM

启动后,会列出当前系统中的所有 JVM 进程,你可以选择要连接的进程 ID。 如:

[INFO] arthas-boot version: 3.5.6
Found existing java process, please choose one and hit ENTER.
* [1]: 12345 com.example.MyApplication

# 常用命令

# dashboard 命令

用于查看应用的实时运行状态,比如线程、内存和 CPU 使用情况:

dashboard

这个命令可以帮助快速定位性能问题,例如高 CPU 使用率或线程死锁。

# thread 命令

用于查看和分析 Java 线程的情况,支持查找死锁和获取线程堆栈信息:

thread

你可以使用 thread -n 3 来查看 CPU 消耗最高的前 3 个线程,或者 thread -b 来列出阻塞的线程。

# watch 命令

实时监控指定方法的执行情况,并可以记录返回值、入参、抛出的异常等信息:

watch com.example.MyClass myMethod returnObj

这个命令特别适合监控特定方法的行为。

watch 还可以按条件进行监控。 你可以通过指定条件来过滤出满足某些条件的调用并进行监控, 尤其是在处理方法参数的时候 。 watch 命令支持表达式,允许你基于方法的输入参数、返回值或者异常来触发监控行为。

举例一,如果你有一个方法 myMethod(String param),并且你希望在 param 参数包含某个特定子串(例如 "test")的时候才进行监控,可以使用如下命令:

watch com.example.MyClass myMethod '{params[0]}' -x 2 -c 'params[0].contains("test")'

举例二,仅监控返回值大于某个值的情况: 如果你想监控方法的返回值大于某个值时触发,可以使用 returnObj 进行条件判断:

watch com.example.MyClass myMethod '{returnObj}' -x 2 -c 'returnObj > 100'

举例三、监控抛出异常的情况: 如果你只想监控方法抛出异常时的情况,可以结合 throwExp 进行条件判断:

watch com.example.MyClass myMethod throwExp -e

举例四:监控特定参数类型的调用: 比如你希望监控某个参数类型为特定类时,可以这样写:

watch com.example.MyClass myMethod '{params[0]}' -x 2 -c 'params[0] instanceof java.lang.String'

# trace 命令

跟踪方法的调用路径及每个方法调用的耗时,特别适合调优性能问题:

trace com.example.MyClass myMethod

trace 命令会打印出整个方法调用链,帮助你发现哪些方法耗时过长。

# stack 命令

打印方法的调用栈,帮助你了解某个方法是如何被调用的:


stack com.example.MyClass myMethod

# jad 命令

用于反编译指定类,生成 Java 源代码,帮助你快速理解某个类的实现:

jad com.example.MyClass

# ognl 命令

Arthas 提供了 OGNL 表达式执行功能,可以通过它快速调用方法、获取和设置属性:

ognl '@java.lang.System@out.println("Hello Arthas")'

# 参考文档

最后更新: Tue, 17 Sep 2024 14:31:01 GMT

0 评论

加载中...
访问量:-