本文大纲

《JVM剖析及性能跟踪》

JVM剖析工具--Arthas

正文

Arthas(阿尔萨斯)介绍

Arthas 是阿里巴巴开源的一款强大的 Java 诊断工具,旨在帮助开发者快速定位和解决 Java 应用中的各种问题。无论是线上环境还是开发环境,Arthas 都能提供强大的支持,帮助开发者深入理解应用的运行状态,诊断性能瓶颈,甚至动态修改代码。由于其功能强大且易于使用,Arthas 已经成为众多 Java 开发者的首选工具之一。

官方文档

Arthas 官方文档

Arthas 能解决哪些问题?

当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:

  • 类加载问题:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 代码未生效:我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 线上调试困难:遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 用户数据问题:线上遇到某个用户的数据处理有问题,但线上无法 debug,线下无法重现!
  • 系统运行状态:是否有一个全局视角来查看系统的运行状况?
  • JVM 监控:有什么办法可以监控到 JVM 的实时运行状态?
  • 性能热点定位:怎么快速定位应用的热点,生成火焰图?

支持环境

  • JDK 版本:支持 JDK 6 及以上版本。
  • 操作系统:支持 Linux、Mac、Windows。
  • 交互模式:采用命令行交互模式,提供丰富的 Tab 自动补全功能,极大地方便了问题的定位和诊断。

Arthas 启动

下载与启动

  1. 下载 Arthas:

    curl -O https://arthas.aliyun.com/arthas-boot.jar
  2. 启动 Arthas:

    • 方式一:直接启动

      java -jar arthas-boot.jar
    • 方式二:使用脚本启动

      ./as.sh

注意事项

  • 权限问题:执行 Arthas 的用户需要和目标进程具有相同的权限,否则可能 attach 失败。例如,如果目标进程是以 admin 用户运行的,可以使用以下命令启动 Arthas:

    sudo su admin && java -jar arthas-boot.jar

    或者:

    sudo -u admin -EH java -jar arthas-boot.jar
  • attach 失败:如果 attach 不上目标进程,可以查看 ~/logs/arthas/ 目录下的日志。

  • 下载速度慢:如果下载速度较慢,可以使用阿里云的镜像:

    java -jar arthas-boot.jar --repo-mirror aliyun --use-http
  • 找不到 tools.jar:如果报错 tools.jar was not found, so arthas could not be launched!,请确保设置了正确的 JAVA_HOME 环境变量。例如:

    export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64

Arthas 常用命令

1. dashboard:实时数据面板

dashboard 命令可以显示当前系统的实时数据面板,包括线程信息、JVM 内存信息及 JVM 运行时参数。按 ctrl+c 退出。

dashboard

image2024-12-8_20-38-33.png

2. thread:线程分析

thread 命令用于查看当前线程信息,帮助诊断线程阻塞、死锁等问题。

  • 查看当前线程列表:

    thread
  • 查看所有线程:

    thread --all
  • 查找阻塞线程:

    thread -b

    注意:目前只支持查找 synchronized 关键字阻塞的线程,java.util.concurrent.Lock 暂不支持。

  • 统计线程 CPU 时间:

    thread -i 1000

    统计最近 1000ms 内的线程 CPU 时间

  • 列出最忙的线程:

    thread -n 3 -i 1000

    列出 1000ms 内最忙的 3 个线程栈。

  • 查看指定状态的线程:

    thread --state WAITING
    thread --state BLOCKED

3. jad:反编译代码

jad 命令可以将 JVM 中实际运行的 class 的字节码反编译成 Java 代码,便于理解业务逻辑。

jad com.example.MyClass

4. classloader:类加载器信息

classloader 命令可以统计 JVM 中所有类加载器的信息,并展示继承树、URLs 等。

classloader

5. dump:导出字节码

dump 命令可以将已加载类的字节码导出到特定目录。

dump com.example.MyClass

6. 其他常用命令

  • sysprop:查看和修改 JVM 系统属性。
  • sysenv:查看 JVM 环境变量。
  • sc:查看 JVM 已加载的类信息。
  • sm:查看类的方法信息。
  • mc:编译 Java 代码。
  • redefine:热更新类。
  • monitor:监控方法执行情况。
  • watch:观察方法执行时的参数和返回值。

参考资料


总结

Arthas 是一款功能强大且易于使用的 Java 诊断工具,能够帮助开发者快速定位和解决 Java 应用中的各种问题。无论是线程分析、内存监控,还是代码热更新,Arthas 都提供了丰富的功能支持。通过熟练掌握 Arthas 的使用,开发者可以显著提升问题排查的效率,优化应用的性能和稳定性。如果你还没有尝试过 Arthas,建议立即下载并体验,相信它会成为你日常开发中的得力助手。