Arthas 实战指南:Java 应用线上诊断与问题排查利器

570 阅读2分钟

Arthas

Arthas 是阿里巴巴开源的一款线上监控诊断产品,实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等。

这里主要是学习和实践 Arthas,原文参见

安装与启动

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

启动后选择要监控的Java进程

常用命令

dashboard:实时监控系统性能,包括线程、内存、GC等

image.png

thread:查看线程信息,如thread -n 3显示最忙的3个线程,thread 1 | grep "main"可以查看线程什么方法的线程

jad:反编译类文件,如jad demo.MathGame

watch:监控方法入参、出参,如watch demo.MathGame primeFactors {params, returnObj},按tab有提示

image.png

监控入参参数<2的两次调用

watch demo.MathGame primeFactors params 'params[0]<2' -n 2
# 对参数进行过滤适用于 watch/trace/stack

trace:方法内部调用路径,并输出方法路径上的每个节点上耗时,如trace demo.MathGame run -n 1-n 1指捕捉几次之后就退出

stack:查看方法被调用路径,如stack demo.MathGame primeFactors

monitor:统计方法调用次数和耗时,如monitor -c 5 demo.MathGame primeFactors

image.png

场景实战

查看最繁忙的线程,以及是否有阻塞情况发生

# 查看最繁忙的三个线程栈信息
thread -n 3
# 以直观的方式展现所有的线程情况
thread
# 找出当前阻塞其他线程的线程
thread -b

确认某个类是否已被系统加载

# 即可以找到需要的类全路径,如果存在的话
sc *MathGame

# 查看这个某个类所有的方法
sm demo.MathGame *

# 查看某个方法的信息,如果存在的话
sm demo.MathGame testMethod  

如何查看一个class类的源码信息

# 直接反编译出java 源代码,包含一此额外信息的
jad demo.MathGame

找到最耗时的方法调用?

# 执行的时候每个子调用的运行时长,可以找到最耗时的子调用。
trace demo.MathGame primeFactors

如何临时更改代码运行?

# 先反编译出class源码
jad jad --source-only demo.MathGame > /tmp/MathGame.java  

# 然后使用外部工具编辑内容
mc /tmp/MathGame.java -d /tmp  # 再编译成class

# 最后,重新载入定义的类,就可以实时验证你的猜测了
redefine /tmp/demo/MathGame.class

image.png

上述可以实现对应用程序在线查看运行状态、参数、调用时间等信息,以及可以实现临时修改代码进行观察