
一、Arthas 是什么?为什么用它?
Arthas 是阿里巴巴开源的一款 Java 线上诊断工具,无需重启 JVM、无需修改代码,即可实时监控、诊断 Java 应用的运行状态。
✅ 适用场景
| 场景 | 传统方式 | Arthas 方式 |
|---|---|---|
| 线上 CPU 飙高 | top + jstack 手动抓栈 |
thread -n 3 一键定位 |
| 接口响应慢 | 加日志 → 重新发布 | trace 追踪耗时 |
| 代码未生效 | 怀疑人生 | jad 反编译确认 |
| 异常信息不全 | 日志缺失 | watch 实时观测 |
| 热更新 | 重启服务 | redefine 热加载 |
二、快速安装与启动
1. 一键启动(推荐)
bash
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
2. 选择目标进程
bash
[INFO] Found existing java process, please choose one:
* [1]: 12345 demo.jar
[2]: 67890 app.jar
输入编号(如 1)即可 attach。
三、线上高频命令速查表
| 命令 | 功能 | 示例 |
|---|---|---|
dashboard |
实时系统面板(线程、内存、GC) | dashboard -i 2000 -n 5 |
thread |
线程分析 | thread -n 3(最忙线程) thread -b(死锁) |
trace |
方法耗时追踪 | trace com.example.UserService getUserById |
watch |
观测方法入参/返回值/异常 | watch com.example.UserService getUserById "{params, returnObj, throwExp}" -x 3 |
jad |
反编译类或方法 | jad com.example.UserService |
sc |
查找已加载的类 | sc -d com.example.UserService |
sm |
查看类方法签名 | sm -d com.example.UserService |
monitor |
方法调用统计 | monitor -c 60 com.example.UserService getUserById |
tt |
方法调用时光隧道(记录与回放) | tt -t com.example.UserService getUserById |
heapdump |
导出堆快照 | heapdump /tmp/dump.hprof |
profiler |
生成 CPU 火焰图 | profiler start → profiler stop --format html |
redefine |
热更新 .class 文件 |
redefine /tmp/UserService.class |
四、实战案例:5 分钟定位线上问题
案例 1:CPU 飙高
bash
# 1. 查看最忙线程
thread -n 1
# 2. 查看堆栈
thread 123
# 3. 反编译问题方法
jad com.example.MyService calculate
案例 2:接口响应慢
bash
# 1. 追踪方法耗时
trace com.example.controller.UserController getProfile
# 2. 发现数据库查询慢
trace com.example.dao.UserDAO findById
# 3. 查看 SQL 参数
watch com.example.dao.UserDAO findById "{params[0]}" -x 1
案例 3:代码未生效(热更新)
bash
# 1. 反编译源码
jad com.example.UserService --source-only > /tmp/UserService.java
# 2. 修改代码后编译
mc /tmp/UserService.java -d /tmp
# 3. 热加载
redefine /tmp/com/example/UserService.class
五、注意事项与最佳实践
| 项目 | 建议 |
|---|---|
| 权限控制 | 生产环境限制使用权限,避免误操作 |
| 性能影响 | watch、trace 会增强字节码,排查后及时 stop 或 reset |
| 安全风险 | 禁止将 Arthas 暴露在公网,建议通过隧道或跳板机访问 |
| 命令冲突 | redefine 与 watch/trace 冲突,使用前需 reset |
六、进阶:Docker & K8s 集成建议
Dockerfile 示例(预装 Arthas)
dockerfile
FROM openjdk:8-jdk-alpine
COPY arthas /opt/arthas
COPY app.jar /app.jar
CMD java -jar /app.jar & \
sleep 15 && \
java -jar /opt/arthas/arthas-boot.jar --tunnel-server 'ws://tunnel-server:7777/ws' --app-name myapp
K8s 一键 attach(推荐)
bash
helm install arthas arthas/arthas-k8s
arthas-k8s attach myapp-0
七、总结:一张图记住 Arthas
text
+--------------------------------------------------+
| Arthas |
| |
| dashboard → 系统面板 |
| thread → 线程/死锁 |
| trace → 方法耗时 |
| watch → 入参/返回值/异常 |
| jad → 反编译 |
| tt → 时光隧道(记录+回放) |
| redefine → 热更新 |
| profiler → 火焰图 |
+--------------------------------------------------+
八、参考资料与延伸阅读
© 2025 技术博客 | 转载请注明原作者与链接