Arthas(阿尔萨斯) 是 Alibaba 开源的 Java 诊断性能监控分析工具, 它不需要做任何的参数配置, 就可以直观的获取各种维度的性能数据. 通过阅读官网的介绍, 可以看到, 当我们遇到以下类似问题而束手无策时, Arthas 可以帮助我们解决:
这个类从哪个 jar 包加载的? 为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到? 难道是我没 commit? 分支搞错了?
遇到问题无法在线上 debug, 难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题, 但线上同样无法 debug, 线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
Arthas 支持 JDK 6+, 支持 Linux/Mac/Winodws, 采用命令行交互模式, 同时提供丰富的 Tab 自动补全功能, 进一步方便进行问题的定位和诊断.
安装
使用 arthas-boot 推荐安装方式, 下载 arthas-boot.jar, 然后用 java -jar 的方式启动:
获取 arthas
在线获取
wget https://alibaba.github.io/arthas/arthas-boot.jar
离线获取
https://alibaba.github.io/arthas/arthas-boot.jar
如果下载速度比较慢, 可以使用 aliyun 的镜像:
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
如果从 GitHub 下载有问题, 可以使用 gitee 镜像
wget https://arthas.gitee.io/arthas-boot.jar
启动 arthas
java -jar arthas-boot.jar
查看帮助信息
java -jar arthas-boot.jar -h
第一次使用 arthas 时, 会自动下载一些依赖包, 等待下载完成, 就会进入到 arthas 提供的命令行界面.
dashboard 实时监控数据
dashboard 命令可以查看当前系统的实时数据面板.
图表说明
ID:Java 级别的线程 ID, 注意这个 ID 不能跟 jstack 中的 nativeID 一一对应
NAME: 线程名
GROUP: 线程组名
PRIORITY: 线程优先级, 1~10 之间的数字, 越大表示优先级越高
STATE: 线程的状态
CPU: 线程消耗的 CPU 占比, 采样 100ms, 将所有线程在这 100ms 内的 CPU 使用量求和, 再算出每个线程的 CPU 使用占比.
TIME: 线程运行总时间, 数据格式为分: 秒
INTERRUPTED: 线程当前的中断位状态
DAEMON: 是否是 daemon 线程
输入 Q 或者 Ctrl+C 可以退出 dashboard 命令.
Thread 查看线程的栈
查看当前线程信息, 查看线程的堆栈, thread 1 命令会打印线程 ID 1 的栈.
同样, Arthas 支持管道, 可以用 thread 1 | grep 'main(' 查找到 main class. 如下, 可以看到 main class 是 demo.MathGame.
参数说明
id: 线程 id
[n:]: 指定最忙的前 N 个线程并打印堆栈
[b]: 找出当前阻塞其他线程的线程
[i <value>]: 指定 CPU 占比统计的采样间隔, 单位为毫秒
Sc(Search-Class)
查看 JVM 已加载的类信息, 搜索出所有已经加载到 JVM 中的 Class 信息.
sc -d *MathGame
参数说明
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
[d]: 输出当前类的详细信息, 包括这个类所加载的原始文件来源, 类的声明, 加载的 ClassLoader 等详细信息. 如果一个类被多个 ClassLoader 所加载, 则会出现多次
[E]: 开启正则表达式匹配, 默认为通配符匹配
[f]: 输出当前类的成员变量信息 (需要配合参数 - d 一起使用)
[x:]: 指定输出静态变量时属性的遍历深度, 默认为 0, 即直接使用 toString 输出
Jad
反编译指定已加载类的源码, 可以通过 jad 命令来反编译代码, jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码, 便于你理解业务逻辑.
jad demo.MathGame
默认情况下, 反编译结果里会带有 ClassLoader 信息, 通过 --source-only 选项, 可以只打印源代码. 方便和 mc/redefine 命令结合使用. 输入 Q 或者 Ctrl+C 退出 watch 命令.
参数说明
class-pattern: 类名表达式匹配
[c:]: 类所属 ClassLoader 的 hashcode
[E]: 开启正则表达式匹配, 默认为通配符匹配
jvm
查看当前 JVM 信息
trace
方法内部调用路径, 并输出方法路径上的每个节点上耗时, trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径, 渲染和统计整个调用链路上的所有性能开销和追踪调用链路.
我们可以看到 "---[0.128988ms] java.io.PrintStream:println() #28" 耗时较长.
参数说明
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
condition-express: 条件表达式
[E]: 开启正则表达式匹配, 默认为通配符匹配
[n:]: 命令执行次数
- #cost: 方法执行耗时
- stack
输出当前方法被调用的调用路径, 很多时候我们都知道一个方法被执行, 但这个方法被执行的路径非常多, 或者你根本就不知道这个方法是从那里被执行了, 此时你需要的是 stack 命令.
参数说明
class-pattern: 类名表达式匹配
method-pattern: 方法名表达式匹配
condition-express: 条件表达式
[E]: 开启正则表达式匹配, 默认为通配符匹配
[n:]: 执行次数限制
Arthas 其他基础命令
help: 查看命令帮助信息
cls: 清空当前屏幕区域
session: 查看当前会话的信息
reset: 重置增强类, 将被 Arthas 增强过的类全部还原, Arthas 服务端关闭时会重置所有增强过的类
version: 输出当前目标 Java 进程所加载的 Arthas 版本号
history: 打印命令历史
quit: 退出当前 Arthas 客户端, 其他 Arthas 客户端不受影响
shutdown: 关闭 Arthas 服务端, 所有 Arthas 客户端全部退出
keymap:Arthas 快捷键列表及自定义快捷键
更多详细介绍, 可阅读 Arthas 用户文档 - Arthas 3.1.1 文档 https://alibaba.github.io/arthas/index.html#arthas
来源: http://news.51cto.com/art/201906/598041.htm