Arthas在线诊断工具实战:热更新与方法追踪
请详细解释Arthas(阿尔萨斯,阿里巴巴开源的Java诊断工具)的常用命令和实战场景。如何使用Arthas在线查看方法调用参数/返回值/异常、热更新代码、追踪调用链路、查看JVM信息、反编译class?给出典型的排查问题流程。
回答
屠龙少年
Arthas简介
Arthas是阿里巴巴开源的Java诊断工具,无需修改代码即可在线诊断Java应用。
常用命令
1. 代码追踪
# 监控方法调用(入参、返回值、异常、耗时)
watch com.example.UserService getUser "{params, returnObj, throwExp}" -x 2
# 方法调用链路(过滤耗时>10ms的)
trace com.example.UserService getUser '#cost > 10'
# 方法执行监控(统计)
monitor com.example.UserService getUser -c 5
2. 在线热更新
# 反编译源码
jad --source-only com.example.UserService > /tmp/UserService.java
# 编辑修改后,编译为class
mc /tmp/UserService.java -d /tmp
# 重新加载class
redefine /tmp/UserService.class
3. 查看JVM信息
# 查看JVM参数
jvm
# 查看线程堆栈(定位死锁、瓶颈)
thread -b # 查看阻塞的线程
thread -n 3 # CPU占用最高的3个线程
# 查看类加载信息
sc -d com.example.UserService # Search Class
sm com.example.UserService # Search Method
# 查看ClassLoader信息
classloader
4. OQL查询堆
# 查找所有User对象
vmtool --action getInstances --className com.example.User --limit 100
5. 其他
# Dashboard(实时监控面板)
dashboard
# 查看系统属性
sysprop
# 查看环境变量
sysenv
# 查看Logger级别
logger
# 动态修改Logger级别
logger --name ROOT --level DEBUG
典型排查流程
# 1. 先看整体情况
dashboard
# 2. 定位高CPU线程
thread -n 5
# 3. 追踪热点方法
trace com.example.MyService slowMethod
# 4. 查看入参和返回值
watch com.example.MyService slowMethod "{params, returnObj, cost}" -x 2
# 5. 如有需要,反编译修改热替换
jad -> 编辑 -> mc -> redefine