前言:线上出 Bug 了,怎么办?

作为一个 Java 后端开发,你一定经历过这样的“至暗时刻”:

  1. 线上报 Bug,但你在本地开发环境怎么都复现不出来
  2. 想看某个方法的入参参数,但代码里没打日志
  3. 运维告诉你 CPU 飙到了 100%,问你是哪行代码导致的,你一脸懵逼。
  4. 刚修完 Bug 发布了,由于流程太慢,你不确定服务器上跑的到底是不是最新代码

按照传统做法,你只能:改代码 -> 加日志 -> 重新打包 -> 申请发布 -> 重启服务。这一套流程下来,半小时过去了,黄花菜都凉了。

今天,我要介绍一款阿里开源的 Java 诊断神器 —— Arthas (阿尔萨斯)。它就像给正在运行的 JVM 做了一次“CT 扫描”,让你拥有上帝视角。


1. 极速安装与启动 🚀

Arthas 是纯 Java 编写的,绿色无毒,即下即用。

Linux/Mac 一键安装:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

启动后,它会列出当前服务器上运行的所有 Java 进程:

[1]: 12345 my-application.jar
[2]: 67890 tomcat-bootstrap

输入对应的数字(比如 1),回车,即可附着(Attach)到该进程上。看到炫酷的 ASCII LOGO,说明启动成功!


2. 场景一:谁占用了我的 CPU?(thread) 🔥

痛点:服务器报警 CPU 100%,运维群里疯狂 @你。

传统做法top -H -p <pid> 查线程 ID,转 16 进制,再 jstack 导出日志去搜... 手慢一点现场就没了。

Arthas 做法
只需输入一条命令,查看最忙的前 3 个线程:

thread -n 3

效果
Arthas 会直接把占用 CPU 最高的线程堆栈打印出来,精确到哪一个类的哪一行代码
你甚至能一眼看出是不是某个 while(true) 死循环,或者正则回溯导致的卡死。


3. 场景二:我的代码发上去了吗?(jad) 🧐

痛点:你明明修了 Bug,也部署了,但线上表现依然不对。你开始怀疑人生:是构建包错了?还是运维没发成功?

Arthas 做法
直接把服务器内存里的字节码反编译成 Java 源代码:

# 反编译 UserController 类
jad com.example.demo.controller.UserController

效果
屏幕上会显示该类当前在 JVM 中运行的源代码。看一眼你修复的那行代码在不在,是不是“版本罗生门”立马破案。


4. 场景三:这个参数到底是啥?(watch) 👀

痛点:线上某个接口报错,你想看看到底是哪个参数传错了,或者返回值对不对。但偏偏这块逻辑没打 Logger。

Arthas 做法
使用 watch 命令,监听方法的执行数据。

# 监听 UserServiceImpl 类的 findUser 方法
# 查看第一个参数(params[0]) 和 返回值(returnObj)
# -x 2 表示遍历深度为 2 (展开对象属性)
watch com.example.service.UserServiceImpl findUser "{params[0], returnObj}" -x 2

效果
只要此时有请求触发这个方法,控制台就会实时打印出具体的入参返回值
就像你在 IDEA 里打了断点一样,但完全不会阻塞线上服务


5. 场景四:线上方法耗时太长?(trace) 🐢

痛点:某个接口响应巨慢,你怀疑是数据库慢,但由于调用链很长,不知道具体卡在哪里。

Arthas 做法
使用 trace 命令追踪调用路径耗时。

trace com.example.controller.OrderController createOrder

效果
Arthas 会输出一棵树状的调用链,并标出每一个步骤消耗的时间

`---[1200ms] createOrder()
    +---[50ms] checkStock()
    +---[10ms] createId()
    `---[1100ms] saveToDb()  <-- 凶手找到了!

一眼就能看出是 saveToDb 这个方法拖了后腿。


6. 进阶大招:热更新代码 (redefine) ⚡️

警告:此功能极其强大但也危险,请谨慎使用!

痛点:线上发现一个简单的空指针 NPE 或者逻辑判断错误,必须立刻修复。重新走发布流程太慢,能否不重启直接打补丁

Arthas 做法

  1. 在本地修好代码,编译成 MyClass.class 文件。
  2. 上传到服务器。
  3. 执行命令:

    redefine /tmp/MyClass.class

效果
JVM 中的类定义被热替换了!新的逻辑立即生效,无需重启服务。这在紧急止血时简直是神技。


总结

Arthas 的功能远不止于此,它还有 dashboard (实时大盘)、tt (时空隧道,重放请求)、ogNL (执行静态方法) 等等强大的功能。

对于 Java 开发者来说:

  • IDEA 是你写代码的神兵利器。
  • Arthas 是你维护代码的听诊器和手术刀。

建议在测试环境多练习几次,把这些命令刻在脑子里。下次线上出现 P0 级故障时,当别人还在满头大汗找日志,你已经淡定地敲下 thread -n 3 找到了根源。

这就是技术专家的护城河

最后修改:2025 年 11 月 21 日
如果觉得我的文章对你有用,请随意赞赏