Arthas 线上排查 Java 问题实录

Arthas 线上排查 Java 问题实录

Arthas 是阿里开源的 Java 诊断工具,核心能力是 attach 到运行中的 JVM 进程,不停机、不改代码,直接查线程状态、监听方法入参/返回值、分析调用链耗时。

安装与启动

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
# 启动后会列出当前机器上的 Java 进程,输入编号选择要 attach 的进程

四个核心命令

dashboard — 整体概览,快速定位问题线程

dashboard

进入 Arthas 后第一步通常先跑 dashboard,能看到所有线程状态、堆内存使用、GC 频率。CPU 飙高时,这里能直接看到哪个线程在占 CPU。

thread — 查看线程状态,找出 CPU 占用最高的线程

thread -n 3         # 显示 CPU 占用最高的 3 个线程的栈信息
thread -b # 查找处于 BLOCKED 状态的线程(排查死锁)
thread <线程ID> # 查看指定线程的完整栈信息

CPU 飙高时用 thread -n 3,栈帧如果一直重复相同几行,基本就是死循环(常见于 JDK7 HashMap 并发问题)。

watch — 监听方法的入参和返回值(最常用)

# 基本用法:监听入参 + 返回值,展开深度 2
watch com.example.service.OrderService calculatePrice '{params, returnObj}' -x 2

# 只在抛出异常时触发
watch com.example.service.OrderService calculatePrice '{params, throwExp}' -e

# 条件过滤,只在第一个入参不为 null 时触发
watch com.example.service.OrderService calculatePrice '{params, returnObj}' 'params[0] != null'

-x 控制展开深度,params 是入参数组,returnObj 是返回值,throwExp 是异常对象。

输出示例:

method=com.example.service.OrderService.calculatePrice location=AtExit
ts=2021-05-18 14:23:41; [cost=2.3ms] result=@ArrayList[
@Object[][
@OrderDTO[orderId=10086, amount=100, couponId=88],
],
@BigDecimal[0],
]

trace — 方法调用链路耗时分析

# 只打印耗时超过 100ms 的调用链
trace com.example.controller.OrderController createOrder '#cost > 100'

输出示例(慢在哪一步,一目了然):

+-- [1234ms] com.example.controller.OrderController.createOrder()
+-- [2ms] inventoryService.deduct()
+-- [1230ms] pointService.add()
+-- [1228ms] RemotePointApi.add()

注意事项

  • watch 对性能有一定影响,生产排查完记得 stopexit 退出,不要长时间挂着高频方法
  • ognl 命令可以执行任意表达式(包括调用方法、修改变量),生产环境谨慎使用
  • attach 进程后如无操作,默认 30 分钟自动退出

适用场景对比

场景推荐方式
问题可复现、非紧急加日志,重新部署
生产偶发问题,无法重启watch 监听入参/返回值
接口响应慢,不知道慢在哪trace 分析调用链耗时
CPU 飙高dashboard + thread -n 3
线程死锁thread -b
想改变量值验证假设ognl(仅测试环境)