本文目录导读:

- 案例一:CPU 飙升排查(最经典案例)
- 案例二:服务假死 / 接口无响应(线程阻塞排查)
- 案例三:偶现 Bug,无法本地复现(线上代码动态 Debug)
- 案例四:线上数据不一致(查看 Redis/LocalCache 值)
- 必知必会的辅助命令
- 小贴士
Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,在实际工作中,最常见的排查场景莫过于 CPU 飙升、线上死锁 和 接口卡顿/线程阻塞。
这里提供三个高频的实战案例及操作命令,帮助你快速定位问题。
CPU 飙升排查(最经典案例)
现象:线上服务报警,某个应用实例的 CPU 使用率达到 200%+,请求响应极慢。
排查思路:定位线程 -> 查看线程栈 -> 定位代码。
操作步骤:
-
找到最耗 CPU 的进程 PID(假设为
12345):top -c
找到 Java 进程 PID。
-
使用 Arthas 连接该进程:
java -jar arthas-boot.jar 12345
-
在 Arthas 中查看最繁忙的线程(核心命令):
thread -n 3
这条命令会打印出 CPU 占用率最高的前 3 个线程的详细栈信息。
输出示例:
"http-nio-8080-exec-10" Id=123 RUNNABLE at com.example.service.OrderService.calculatePrice(OrderService.java:45) at com.example.service.OrderService.getOrder(OrderService.java:88) ... -
定位代码:直接在
OrderService.java:45行附近查找是否有死循环、大对象计算或频繁 GC。
服务假死 / 接口无响应(线程阻塞排查)
现象:接口偶尔报超时,或者服务整体“卡死”,但进程还在,CPU 不高。
排查思路:找出处于 BLOCKED 或 WAITING 状态的线程,查看它们被哪个锁卡住了。
操作步骤:
-
进入 Arthas 后,直接查看阻塞线程:
thread -b
这条命令会直接帮你找出阻塞其他线程的线程(即持有锁不释放的线程)。
-
thread -b没有输出,说明没有线程锁竞争,可能是线程池耗尽。 查看当前线程池状态(JVM 内部线程):thread --state BLOCKED
或者查看所有线程的整体状态:
thread --state WAITING
-
尝试主动触发一次线程 Dump 分析:
thread -n 5
观察是否有线程卡在
LockSupport.park或Object.wait上。
偶现 Bug,无法本地复现(线上代码动态 Debug)
现象:线上逻辑在某些特定参数下计算错误,但本地调试无法复现问题,你怀疑某个私有方法的入参或返回值不对。
排查思路:使用 Arthas 的 Watch 或 Trace 命令,在不重启服务的情况下,实时打印线上方法的入参和返回值。
操作步骤:
-
监控某个方法的入参和返回值: 假设接口是
com.example.OrderService.getOrder(Long orderId):watch com.example.OrderService getOrder '{params, returnObj}' -x 2参数解释:
-x 2表示遍历深层对象(最多 2 层)。 -
如果觉得打印太多,可以加条件过滤,比如只关注
orderId小于 100 的:watch com.example.OrderService getOrder '{params, returnObj}' 'params[0] < 100' -x 2 -
如果方法比较耗时,想看看哪一步慢(性能瓶颈):
trace com.example.OrderService getOrder '#cost > 1000'
当执行时间超过 1000ms 时,自动打印每一步的子调用耗时。
线上数据不一致(查看 Redis/LocalCache 值)
现象:Bug 是“缓存没更新”,或者“缓存穿透”,需要确认线上 JVM 内缓存的实际值。
排查思路:使用 vmtool 命令(Arthas 4.x 以上支持)直接读取线上 JVM 中的对象。
操作步骤:
-
想查看 Spring Context 中的 Bean:
vmtool --action getInstances --className com.example.cache.LocalCache --limit 1
-
想直接执行对象的某个方法,强行调用
get()看看缓存里到底是什么:vmtool --action getInstances --className com.example.cache.LocalCache --express 'instances[0].get("order_888")'
必知必会的辅助命令
dashboard:查看整体概况(CPU、内存、垃圾回收情况),进入 Arthas 后第一件事建议敲这个。jad com.example.OrderService:反编译线上运行的 Class 文件,确认服务器上跑的就是你本地最新的代码(排查“改了代码没生效”)。
小贴士
- 注意防火墙:Arthas 启动后默认会监听
0.0.1:3658,如果在 K8s 或 Docker 中,建议在 Pod 内直接执行,或者配置端口转发。 - 安全问题:生产环境使用 Arthas 需谨慎,不要随意执行高危命令,且建议利用
--async参数处理耗时操作,避免阻塞目标业务线程。 - 退出:使用
stop命令退出并关闭 Arthas 服务端,否则会常驻 JVM 中。
如果你有具体的场景(秒杀系统卡顿”或“内存溢出”),可以补充条件,我可以给出更针对性的命令组合。