Arthas介绍
今天翻阅文档突然发现了一个新名词’Arthas’,百度一番后记录一下~
以下内容均来自arthas官网
简介

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率
这款工具可以直接在生产环境排查代码且无需重启服务。
Arthas
Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?
Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断
使用说明
1、启动Arthas
在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
1 | curl -O https://arthas.aliyun.com/arthas-boot.jar |
- 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。
- 如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志。
- 如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar –repo-mirror aliyun –use-http
- java -jar arthas-boot.jar -h 打印更多参数信息
选择应用 java 进程:
1 | $ $ java -jar arthas-boot.jar |
运行arthas后会出现当前运行java服务的 pid 和 主类名 选择相应的服务即可
比如监听的服务为第二个,则输入 2,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:
1 | [INFO] Try to attach process 71560 |
###扩展:多种连接方式
指定进程名字启动
通过select参数可以指定进程名字,非常方便。
1 | $ ./as.sh --select math-game |
以Java Agent的方式启动
1 | java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar |
查看dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
1 | $ dashboard |
通过thread命令来获取进程的Main Class
thread 1会打印线程 ID 1 的栈,通常是 main 函数的线程。
1 | $ thread 1 | grep 'main(' |
通过jad来反编译Main Class
1 | $ jad demo.tingfeng |
watch
通过watch命令来查看demo.tingfeng#primeFactors函数的返回值:
1 | $ watch demo.tingfeng primeFactors returnObj |
Arthas Properties
arthas.properties文件在 arthas 的目录下。
- 如果是自动下载的 arthas,则目录在~/.arthas/lib/3.x.x/arthas/下面
- 如果是下载的完整包,在 arthas 解压目录下
支持的配置项
支持的配置项
1 | #arthas.config.overrideAll=true |
如果配置 arthas.telnetPort为 -1 ,则不 listen telnet 端口。arthas.httpPort类似。
如果配置 arthas.telnetPort为 0 ,则随机 telnet 端口,在~/logs/arthas/arthas.log里可以找到具体端口日志。arthas.httpPort类似。
如果是防止一个机器上启动多个 arthas 端口冲突。可以配置为随机端口,或者配置为 -1,并且通过 tunnel server 来使用 arthas。
禁止指定命令
比如配置:
1 | arthas.disabledCommands=stop,dump |
也可以在命令行配置: –disabled-commands stop,dump 。
默认情况下,arthas-spring-boot-starter 会禁掉stop命令。
配置的优先级
配置的优先级是:命令行参数 > System Env > System Properties > arthas.properties 。
./as.sh --telnet-port 9999传入的配置会覆盖掉arthas.properties里的默认值arthas.telnetPort=3658。- 如果应用自身设置了 system properties
arthas.telnetPort=8888,则会覆盖掉arthas.properties里的默认值arthas.telnetPort=3658。
如果想要 arthas.properties的优先级最高,则可以配置 arthas.config.overrideAll=true 。
命令列表
jvm相关
- dashboard - 当前系统的实时数据面板
- getstatic - 查看类的静态属性
- heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
- jvm - 查看当前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的内存信息
- ognl - 执行 ognl 表达式
- perfcounter - 查看当前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的环境变量
- sysprop - 查看和修改 JVM 的系统属性
- thread - 查看当前 JVM 的线程堆栈信息
- vmoption - 查看和修改 JVM 里诊断相关的 option
- vmtool - 从 jvm 里查询对象,执行 forceGc
class/classloader 相关
- classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
- dump - dump 已加载类的 byte code 到特定目录
- jad - 反编译指定已加载类的源码
- mc - 内存编译器,内存编译.java文件为.class文件
- redefine - 加载外部的.class文件,redefine 到 JVM 里
- retransform - 加载外部的.class文件,retransform 到 JVM 里
- sc - 查看 JVM 已加载的类信息
- sm - 查看已加载类的方法信息
monitor/watch/trace 相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。
- monitor - 方法执行监控
- stack - 输出当前方法被调用的调用路径
- trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
- tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
- watch - 方法执行数据观测
profiler/火焰图
- profiler - 使用async-profiler对应用采样,生成火焰图
- jfr - 动态开启关闭 JFR 记录
鉴权
- auth - 鉴权
options
- options - 查看或设置 Arthas 全局开关
管道
Arthas 支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep ‘index’
- grep - 搜索满足条件的结果
- plaintext - 将命令的结果去除 ANSI 颜色
- wc - 按行统计输出结果
后台异步任务
当线上出现偶发的问题,比如需要 watch 某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了,详情请参考这里
- 使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session 断开不影响任务执行(生命周期默认为 1 天)
- jobs - 列出所有 job
- kill - 强制终止任务
- fg - 将暂停的任务拉到前台执行
- bg - 将暂停的任务放到后台执行
基础命令
- base64 - base64 编码转换,和 linux 里的 base64 命令类似
- cat - 打印文件内容,和 linux 里的 cat 命令类似
- cls - 清空当前屏幕区域
- echo - 打印参数,和 linux 里的 echo 命令类似
- grep - 匹配查找,和 linux 里的 grep 命令类似
- help - 查看命令帮助信息
- history - 打印命令历史
- keymap - Arthas 快捷键列表及自定义快捷键
- pwd - 返回当前的工作目录,和 linux 命令类似
- quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- reset - 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- session - 查看当前会话的信息
- stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
- tee - 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
- version - 输出当前目标 Java 进程所加载的 Arthas 版本号
Web Console(通过浏览器连接arthas)
Arthas 目前支持 Web Console,用户在 attach 成功之后,可以直接访问:http://127.0.0.1:8563/。

可以填入 IP,远程连接其它机器上的 arthas。
默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定 listen 的 IP,更多参考-h的帮助说明。 注意会有安全风险,考虑下面的 tunnel server 的方案
Docker部署的应用使用arthas
docker使用方式
1.删除本地已有的math-game docker container(非必要)
1 | $ docker stop math-game || true && docker rm math-game || true |
2.启动java服务
1 | $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar" |
3.启动arthas-boot来进行诊断
1 | $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar" |
诊断 Docker 里的 Java 进程
1 | docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" |
诊断 k8s 里容器里的 Java 进程
1 | kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" |
把 Arthas 安装到基础镜像里
1 | FROM openjdk:8-jdk-alpine |
Arthas Spring Boot Starter
只支持spring boot2
配置maven依赖:
1 | <dependency> |
应用启动后,spring 会启动 arthas,并且 attach 自身进程。
IDEA Plugin
Arthas-idea(部分命令可视化)
插件由社区开发者提供。
- Jetbrains 插件获取地址: https://plugins.jetbrains.com/plugin/13581-arthas-idea
- 使用文档:https://www.yuque.com/arthas-idea-plugin
- 源码地址: https://github.com/WangJi92/arthas-idea-plugin
退出arthas
如果只是退出当前的连接,可以用quit或者exit命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出 arthas,可以执行stop命令。


