说明

Arthas 是一个开源的、针对 Java 应用程序的动态诊断工具,由 Alibaba 开源。它提供了丰富的功能来帮助开发者在线调试 Java 应用,无需重启服务即可实时监控与诊断问题,极大提升了生产环境中问题定位的效率。

文档

https://arthas.aliyun.com

核心特性

  1. 类加载信息查询:可以查看已加载的类信息、搜索类、查看类加载器的树状结构等。
  2. 方法跟踪与诊断:允许你跟踪任意方法的调用路径、入参、返回值以及耗时,这对于性能瓶颈分析特别有用。
  3. 实时代码热更新:能够在不重启 JVM 的情况下修改类的字节码,实现方法内容的替换,这对于快速修复线上问题非常便利。
  4. 内存查看与分析:类似于 jmap,但提供了更加友好的界面来分析堆内存使用情况,包括查找大对象、泄露对象等。
  5. 线程堆栈分析:可以方便地获取线程堆栈信息,帮助分析线程死锁和状态。
  6. 表达式求值:可以直接在运行中的 JVM 上执行 Java 表达式,并查看结果,这对于调试变量值非常有用。
  7. JVM 信息监控:查看 JVM 各种运行时信息,比如 GC 状态、编译情况、内存使用情况等。

使用步骤

  1. 下载curl -O https://arthas.aliyun.com/arthas-boot.jar
  2. 启动:在目标 Java 应用的服务器上,通过命令行启动 Arthas,通常命令为 java -jar arthas-boot.jar
  3. 连接:Arthas 会列出当前系统中所有运行的 Java 进程,你可以选择一个进程连接。
  4. 使用命令:连接后,就可以开始使用 Arthas 提供的各种命令进行诊断和分析了。

基础命令

  • help—— 查看命令帮助信息
  • cat—— 打印文件内容,和 linux 里的 cat 命令类似
  • echo–打印参数,和 linux 里的 echo 命令类似
  • grep—— 匹配查找,和 linux 里的 grep 命令类似
  • tee—— 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
  • pwd—— 返回当前的工作目录,和 linux 命令类似
  • cls—— 清空当前屏幕区域
  • session—— 查看当前会话的信息
  • reset—— 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version—— 输出当前目标 Java 进程所加载的 Arthas 版本号
  • history—— 打印命令历史
  • exit/quit—— 退出当前的连接
  • stop—— 完全退出 arthas
  • keymap——Arthas 快捷键列表及自定义快捷键

jvm 相关

  • dashboard—— 当前系统的实时数据面板
  • thread—— 查看当前 JVM 的线程堆栈信息
  • jvm—— 查看当前 JVM 的信息
  • sysprop—— 查看和修改 JVM 的系统属性
  • sysenv—— 查看 JVM 的环境变量
  • vmoption—— 查看和修改 JVM 里诊断相关的 option
  • perfcounter—— 查看当前 JVM 的 Perf Counter 信息
  • logger—— 查看和修改 logger
  • getstatic—— 查看类的静态属性
  • ognl—— 执行 ognl 表达式
  • mbean—— 查看 Mbean 的信息
  • heapdump——dump java heap, 类似 jmap 命令的 heap dump 功能

class/classloader 相关

  • sc—— 查看 JVM 已加载的类信息

    1
    sc -d com.bjtcrj.scm.system.controller.LoginController
  • sm—— 查看已加载类的方法信息

    1
    sm -d com.bjtcrj.scm.system.controller.LoginController validateLogin
  • jad—— 反编译指定已加载类[方法]的源码

    1
    jad com.bjtcrj.scm.system.controller.LoginController [方法]
  • mc—— 内存编译器,内存编译.java文件为.class文件

  • redefine—— 加载外部的.class文件,redefine 到 JVM 里

  • dump——dump 已加载类的 byte code 到特定目录

  • classloader—— 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource

monitor/watch/trace 相关

请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。

  • monitor—— 方法执行监控

  • watch—— 方法执行数据观测

  • trace—— 方法内部调用路径,并输出方法路径上的每个节点上耗时

  • stack—— 输出当前方法被调用的调用路径

  • tt—— 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

    1
    tt -t -n 1000 com.bjtcrj.scm.system.controller.LoginController validateLogin

profiler / 火焰图

options

  • options—— 查看或设置 Arthas 全局开关

管道

Arthas 支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep 'index'

  • grep—— 搜索满足条件的结果
  • plaintext—— 将命令的结果去除 ANSI 颜色
  • wc—— 按行统计输出结果