|
Arthas 是阿里开源的 Java 诊断工具,无需修改代码 / 重启服务,即可在线排查 Linux 下 Java 服务问题,以下是从安装到核心用法的完整教程: 一、快速安装 & 启动 1. 安装(Linux 服务器上操作) # 下载arthas-boot.jar(阿里官方源)curl -O # 启动(会列出当前Java进程,选择要监控的PID即可)java -jar arthas-boot.jar 启动后会显示类似如下列表,输入数字(比如1)选择要诊断的 Java 进程,回车进入 Arthas 控制台: 二、核心功能:替代 JConsole 的监控能力 1. 实时仪表盘(核心!替代 JConsole 的概览面板) dashboard 2. 内存监控(对应 JConsole “内存”) jvm 3. 线程监控(对应 JConsole “线程”) # 查看所有线程状态(ID、名称、状态、CPU占用)thread# 查看阻塞/等待的线程(重点!排查卡顿)thread -b # 找出当前阻塞其他线程的“元凶”线程thread -w # 查看处于WAITING状态的线程# 查看指定线程的栈信息(替换为线程ID/名称)thread 46 # 查看ID=46的线程栈,对应JConsole“线程→栈跟踪” 三、高频诊断场景(比 JConsole 更强的功能) 1. 排查慢接口 / 方法 # 监控指定方法的执行耗时(替换为你的类+方法名)trace com.xxx.Service queryData # 追踪方法调用链路+耗时watch com.xxx.Service queryData '{cost}' -x 2 # 查看方法执行耗时(单位:ms) trace trace是 Arthas 中追踪方法调用链路的核心命令,能精准输出 ①目标方法的总执行耗时; ②方法内部调用的所有子方法(包括第三方库、JDK 内置方法); ③每个子方法的执行耗时和占比; ④甚至能捕获方法执行中的异常。 简单说:trace 是 “追根溯源”,告诉你目标方法慢在哪个子步骤。 # 基础语法trace 类全限定名 方法名 [可选参数]# 示例:追踪 com.xxx.Service 类的 queryData 方法trace com.xxx.Service queryData 先找到接口的路径,执行命令,开始监听 trace com.hnevol.client.bases.controller.org.LibDeptController getBasicDeptTree 程序页面访问接口,输出过程 更进一步分析接口 查询耗时27%和48%分别属于查询和转换两个步骤 关键参数 & 进阶用法 watch watch是 Arthas 中灵活的方法数据观测命令,可以: ①监控方法的入参、返回值、异常、执行耗时; ②按条件过滤(如只看耗时 > 500ms 的调用); ③自定义输出格式(只看你关心的字段)。 # 基础语法watch 类全限定名 方法名 观测表达式 [可选参数]# 示例:观测 queryData 方法的执行耗时watch com.xxx.Service queryData '{cost}' -x 2 内置变量(直接可用) 基础数据观测 # 观测耗时watch com.xxx.Service query '{cost}' -x 2# 观测入参+返回值watch com.xxx.Service query '{params, returnObj}' -x 2# 观测入参(仅第一个入参)+耗时watch com.xxx.Service query '{params[0], cost}' -x 2# 观测异常信息(仅方法抛出异常时输出)watch com.xxx.Service query '{throwExp, cost}' -x 2 -e 复杂数据提取(结合对象属性) # 观测入参的某个属性(如入参是User对象,提取其name属性)watch com.xxx.Service query '{params[0].name, returnObj.data}' -x 3# 观测对象实例的属性(如target是Service实例,提取其成员变量config)watch com.xxx.Service query '{target.config, cost}' -x 2 条件过滤观测 # 仅观测耗时>500ms的调用watch com.xxx.Service query '{params, cost}' -x 2 '#cost > 500'# 仅观测入参中id=1001的调用watch com.xxx.Service query '{params, returnObj}' -x 2 '#params[0].id == 1001' watch com.hnevol.client.bases.service.org.impl.LibDeptServiceImpl getBasicDeptTree '{params, returnObj}' -x 2 trace vs watch:核心区别(怎么选?) 2. 反编译类(排查代码是否生效) jad com.xxx.Service # 反编译指定类,查看运行时的实际代码 jad com.hnevol.client.bases.service.org.impl.LibDeptServiceImpl 3. monitor: 方法执行频率 / 成功率监控(长期观测) # 每5秒统计一次,监控queryData方法的执行情况monitor -c 5 com.xxx.Service queryData 4. stack: 查看方法调用栈 (定位方法被谁调用) # 查看queryData方法的调用栈(只输出前5次)stack com.xxx.Service queryData -n 5# 只查看耗时>100ms的调用栈stack com.xxx.Service queryData '#cost > 100' 5. tt: 方法执行数据录制 (回放问题) 录制方法的入参、返回值、耗时等数据,支持回放调用(复现偶发问题) # 录制queryData方法的执行数据(记录前10次调用)tt -t com.xxx.Service queryData -n 10# 查看录制的记录(会生成index编号)tt -l# 回放指定index的调用(复现问题,无实际业务影响)tt -p -i 1000 # 1000是录制的index编号 总结: 接口慢,定位慢子方法:trace -> stack 接口偶发失败/ 耗时波动:watch -> monitor -> tt 验证线上代码:jad 内存占用高:dashboard -> jvm 线程监控:dashboard -> thread 四、生产环境使用建议 1、必加 -n 参数:避免命令一直运行刷屏,比如 trace com.xxx.Service queryData -n 5(只看 5 次调用); 2、按耗时过滤:优先用 #cost > 阈值 筛选慢调用,比如 watch ... '#cost > 500'(只看超过 500ms 的调用); 3、权限一致:启动 Arthas 的用户需和 Java 进程运行用户一致(否则无权限监控); 4、低峰期测试:trace 命令有轻微性能开销,生产环境建议在低峰期使用。 |

