• Linux:Java诊断工具-Arthas
  • 意昂体育
新闻动态
热点资讯
推荐资讯
你的位置:意昂体育 > 新闻动态 >

Linux:Java诊断工具-Arthas

发布日期:2026-01-31 06:35 点击次数:68

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 命令有轻微性能开销,生产环境建议在低峰期使用。

------

QQ咨询

QQ: