Arthas 是阿里开源的Java诊断工具,能在不重启应用的情况下实现线上问题排查、性能监控和动态代码热更新。本文将详细介绍其核心功能与使用技巧。
一、快速安装与启动
bash
# 下载最新版Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动并选择目标JVM进程
java -jar arthas-boot.jar
启动后会显示当前机器上的Java进程列表,输入序号即可附加到目标进程进行诊断。
二、性能瓶颈定位:trace命令
命令格式:
bash
trace [全限定类名] [方法名] '#cost>阈值' -n 监控次数
核心功能 :
追踪方法内部调用链,精确到每一行代码的耗时,快速定位性能瓶颈。
使用示例:
bash
# 监控saveMedicalDiag方法,仅显示耗时>10ms的调用,最多捕获5次
trace com.example.ClinicService saveMedicalDiag '#cost>10' -n 5
输出解读:
`---ts=2025-07-30 12:00:00;thread_name=http-nio-8080-exec-1;id=1e;is_daemon=true;priority=5;
`---[15.78ms] com.example.ClinicService:saveMedicalDiag()
+---[0.5ms] com.example.DBUtil:getConnection()
+---[12.0ms] com.example.DAO:insert() # ⚠️ 主要耗时点
`---[3.2ms] com.example.Logger:writeLog()
注意事项:
- 默认忽略
java.*
包下的调用,需逐层排查或使用正则监控多层调用 - 正则监控示例:
trace -E com.service.*|com.dao.* save*
三、运行时数据观测:watch命令
命令格式:
bash
watch [类名] [方法名] '{观察表达式}' [参数]
核心功能
观察表达式 | 作用 | 示例 |
---|---|---|
params |
捕获方法入参 | {params[0].userName} |
target |
获取当前对象属性 | target.connectionPoolSize |
returnObj |
获取返回值 | returnObj.status |
throwExp |
捕获异常信息 | throwExp.getMessage() |
常用参数
参数 | 作用 |
---|---|
-b |
方法调用前触发 |
-e |
异常时触发 |
-s |
方法返回后触发 |
-f |
方法结束后触发 |
-x 3 |
设置对象遍历深度 |
-n 10 |
仅监控前10次调用 |
--exclude-class-pattern *Controller |
排除特定类 |
实用场景示例
1. 监控异常时的入参:
bash
watch com.example.OrderService createOrder '{params, throwExp}' -e -x 3
输出:
ts=2025-07-30 14:30:00; [cost=45ms] result=ArrayList[
@Object[][ # 入参
@OrderRequest[userId="U123", productId=null], # ⚠️ 空值导致异常
],
ctd.persistence.DAOException: 产品ID不能为空! # 异常信息
]
2. 监控返回值属性:
bash
watch com.example.UserService getUser '{returnObj.age, returnObj.name}' -s
3. 跟踪对象状态变化:
bash
watch com.example.CacheService refresh 'target.cacheSize' -f
四、Arthas核心优势
-
无侵入诊断
无需修改代码或重启服务,直接接入线上JVM进程
-
精准定位
trace
精确到代码行级耗时,watch
实时捕获运行时数据 -
动态热更新
-
全链路支持
集成火焰图、线程分析、内存监控等全方位工具
五、使用建议
-
生产环境慎用
优先在测试环境验证命令,避免
-f
参数导致大量日志输出 -
组合使用命令
先用
trace
定位瓶颈方法,再用watch
分析具体参数 -
正则表达式优化
使用
-E
参数批量监控多个类:watch -E 'com.service.*|com.dao.*' *
通过Arthas官方提供的https://arthas.aliyun.com/doc/web-console.html可图形化操作,提升诊断效率。
掌握Arthas的核心命令,能让Java应用的线上问题排查效率提升数倍,真正实现"无需重启的诊断艺术"。