那天下午,产品急匆匆找我:“这个用户的接口老是卡住,能帮忙看看吗?”
我一脸自信地打开日志、重启服务、加点打印 —— 毫无收获。Bug 就像隐身了,线上一切正常,但用户就是在等响应时卡住。
直到同事一句:
“你用 Arthas 看下现场?”
才让我打开了这个线上 Debug 神器 Arthas的大门。
💡 Arthas 是什么?
Arthas 是阿里巴巴开源的一款 Java 诊断工具,可以直接 attach 到线上运行中的 JVM,查看线程、方法调用、内存使用、类加载等等 —— 无需重启!无需代码改动!
一句话总结它的能力:
远程诊断 + 热修复 + 性能分析,全都一个命令搞定。
🚀 快速上手:只需一条命令
在服务器上直接执行:
curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar
Arthas 会自动列出当前机器上的所有 Java 进程,让你选择 attach 到目标程序。
🔨 常用命令实战举例
下面列出我在生产环境中最常用、也最推荐你记住的几个命令。
1️⃣ dashboard
:资源看板,一秒感知现场状况
执行后会实时显示:
- CPU 使用率最高的线程
- JVM 堆内存使用情况
- 类加载数量
- 线程数与死锁情况
🚨 我之前就是用这个,发现某个方法 CPU 飙到 400%!
2️⃣ thread
:快速查看线程堆栈!
找卡顿?找死锁?你可以这样:
thread -n 5
查看CPU占用最高的前5个线程,再加-b 参数能查看详细堆栈:
thread 45 -b
我在一次“接口假死”问题中,用这个命令发现某线程卡在远程调用阻塞处,立马定位!
3️⃣ jad
:在线反编译某个类-
jad com.example.controller.UserController
你可以直接查看运行时类的反编译源码!无需源码包也能看项目逻辑。
4️⃣ watch
:方法入参 & 出参 & 返回值观察利器-
watch com.example.Service getUserById '{params, returnObj}' -x 3
功能强到离谱:
- 实时查看方法调用的入参和返回值
- 支持条件过滤
- 不修改任何业务逻辑
5️⃣tt(Time Tunnel)官方名为时空隧道:看过去的请求发生了什么
tt -t com.example.Controller getUsertt -ltt -i 1000
你可以:
- 记录某方法的所有调用
- 回放历史调用的入参 & 出参
- 分析线上问题的整个过程
这就像你给线上加了一台“时光机”!
📦 适合 Arthas 的使用场景
场景 | Arthas 的作用 |
---|---|
接口卡顿 | thread 看是否阻塞 |
方法逻辑异常 | watch 查看参数传递过程 |
找不到源码 | jad 直接反编译 |
内存泄漏怀疑 | heapdump 导出快照分析 |
方法过慢 | trace 追踪调用链条耗时 |
❤️ 总结
如果你是一名后端 Java 程序员,如果你曾经在线上“盲调”、“加日志”、“重启碰碰运气”……
Arthas 会是你的救命工具。
我已经把它作为线上诊断的“标配”,甚至很多新同事入职,我都会强烈推荐他先熟一熟这个工具。
Debug笔记
记录我在代码背后踩过的坑,也分享那些曾经提升过我效率的关键思路。
关注我,一起成为更优雅的程序员。