Arthas案例

wen java案例 1

本文目录导读:

Arthas案例

  1. 案例一:CPU 飙升排查(最经典案例)
  2. 案例二:服务假死 / 接口无响应(线程阻塞排查)
  3. 案例三:偶现 Bug,无法本地复现(线上代码动态 Debug)
  4. 案例四:线上数据不一致(查看 Redis/LocalCache 值)
  5. 必知必会的辅助命令
  6. 小贴士

Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,在实际工作中,最常见的排查场景莫过于 CPU 飙升线上死锁接口卡顿/线程阻塞

这里提供三个高频的实战案例及操作命令,帮助你快速定位问题。


CPU 飙升排查(最经典案例)

现象:线上服务报警,某个应用实例的 CPU 使用率达到 200%+,请求响应极慢。

排查思路:定位线程 -> 查看线程栈 -> 定位代码。

操作步骤:

  1. 找到最耗 CPU 的进程 PID(假设为 12345):

    top -c

    找到 Java 进程 PID。

  2. 使用 Arthas 连接该进程

    java -jar arthas-boot.jar 12345
  3. 在 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)
        ...
  4. 定位代码:直接在 OrderService.java:45 行附近查找是否有死循环、大对象计算或频繁 GC。


服务假死 / 接口无响应(线程阻塞排查)

现象:接口偶尔报超时,或者服务整体“卡死”,但进程还在,CPU 不高。

排查思路:找出处于 BLOCKEDWAITING 状态的线程,查看它们被哪个锁卡住了。

操作步骤:

  1. 进入 Arthas 后,直接查看阻塞线程

    thread -b

    这条命令会直接帮你找出阻塞其他线程的线程(即持有锁不释放的线程)。

  2. thread -b 没有输出,说明没有线程锁竞争,可能是线程池耗尽。 查看当前线程池状态(JVM 内部线程):

    thread --state BLOCKED

    或者查看所有线程的整体状态:

    thread --state WAITING
  3. 尝试主动触发一次线程 Dump 分析

    thread -n 5

    观察是否有线程卡在 LockSupport.parkObject.wait 上。


偶现 Bug,无法本地复现(线上代码动态 Debug)

现象:线上逻辑在某些特定参数下计算错误,但本地调试无法复现问题,你怀疑某个私有方法的入参或返回值不对。

排查思路:使用 Arthas 的 WatchTrace 命令,在不重启服务的情况下,实时打印线上方法的入参和返回值。

操作步骤:

  1. 监控某个方法的入参和返回值: 假设接口是 com.example.OrderService.getOrder(Long orderId)

    watch com.example.OrderService getOrder '{params, returnObj}' -x 2

    参数解释:-x 2 表示遍历深层对象(最多 2 层)。

  2. 如果觉得打印太多,可以加条件过滤,比如只关注 orderId 小于 100 的:

    watch com.example.OrderService getOrder '{params, returnObj}' 'params[0] < 100' -x 2
  3. 如果方法比较耗时,想看看哪一步慢(性能瓶颈):

    trace com.example.OrderService getOrder '#cost > 1000'

    当执行时间超过 1000ms 时,自动打印每一步的子调用耗时。


线上数据不一致(查看 Redis/LocalCache 值)

现象:Bug 是“缓存没更新”,或者“缓存穿透”,需要确认线上 JVM 内缓存的实际值。

排查思路:使用 vmtool 命令(Arthas 4.x 以上支持)直接读取线上 JVM 中的对象。

操作步骤:

  1. 想查看 Spring Context 中的 Bean

    vmtool --action getInstances --className com.example.cache.LocalCache --limit 1
  2. 想直接执行对象的某个方法,强行调用 get() 看看缓存里到底是什么

    vmtool --action getInstances --className com.example.cache.LocalCache --express 'instances[0].get("order_888")'

必知必会的辅助命令

  • dashboard:查看整体概况(CPU、内存、垃圾回收情况),进入 Arthas 后第一件事建议敲这个
  • jad com.example.OrderService:反编译线上运行的 Class 文件,确认服务器上跑的就是你本地最新的代码(排查“改了代码没生效”)。

小贴士

  1. 注意防火墙:Arthas 启动后默认会监听 0.0.1:3658,如果在 K8s 或 Docker 中,建议在 Pod 内直接执行,或者配置端口转发。
  2. 安全问题:生产环境使用 Arthas 需谨慎,不要随意执行高危命令,且建议利用 --async 参数处理耗时操作,避免阻塞目标业务线程。
  3. 退出:使用 stop 命令退出并关闭 Arthas 服务端,否则会常驻 JVM 中。

如果你有具体的场景(秒杀系统卡顿”或“内存溢出”),可以补充条件,我可以给出更针对性的命令组合。

抱歉,评论功能暂时关闭!