arthas通过四步分层诊断java线上响应变慢问题:先用dashboard看全局状态,再用thread -n 5揪高cpu线程,接着用trace逐层追踪方法耗时,最后用watch观察参数、返回值及异常。

Java线上应用响应变慢,通常不是日志能直接暴露的问题,尤其在无法复现、不敢加日志、不能重启的生产环境里。Arthas 能在不改代码、不重启服务的前提下,快速定位到慢在哪一层——是方法本身耗时高?数据库查询没走索引?还是线程被阻塞或锁竞争?关键在于按顺序执行这四步。
第一步:看整体状态,确认是否真“慢”且找异常信号
先运行 dashboard 命令,进入实时监控面板。它每秒刷新一次,重点关注三块:
- 线程数:活跃线程是否突增?是否有大量 WAITING 或 BLOCKED 状态?
- 内存使用:老年代(Old Gen)使用率是否持续上涨?GC 频次是否明显升高?
- HTTP QPS/RT(若用 Ali-Tomcat):平均响应时间(RT)是否飙升?错误数是否同步上升?
如果 RT 明显拉高但 CPU 不高,大概率是 IO 阻塞或线程等待;如果 RT 和 CPU 同时飙高,要优先查 CPU 密集型线程。
第二步:揪出最忙的线程,定位热点方法
执行 thread -n 5,列出 CPU 占用最高的 5 个线程。重点看它的栈顶方法,比如:
"http-nio-8080-exec-25" Id=25 TIMED_WAITING ... at java.lang.Thread.sleep(Native Method) ... at com.example.service.OrderService.calculatePrice(OrderService.java:42)如果发现某线程长期卡在某个业务方法(如 calculatePrice),就记下线程 ID,再用 thread
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
第三步:追踪可疑方法,看哪一环拖慢了整条链
对 dashboard 或 thread 中怀疑的业务方法,用 trace 命令逐层分析耗时:
- trace com.example.controller.OrderController createOrder —— 查 Controller 层总耗时
- trace com.example.service.OrderService createOrder —— 进入 Service 层,看子调用分布
- trace com.example.dao.OrderMapper insert —— 若发现 DB 操作慢,继续追 Mapper 方法
输出中会显示每一级调用的耗时(ms)、是否异常、是否命中缓存等。如果某次 SQL 执行耗时 2s,而 trace 显示它调用了 JdbcTemplate.query,就基本锁定是 SQL 或连接池问题。
第四步:观察参数与返回,验证逻辑是否符合预期
有些“慢”其实是逻辑异常导致的,比如空循环、重复查库、或异常重试。这时用 watch 监控入参和返回值:
- watch com.example.service.UserService login "{params, returnObj}" -x 2 —— 看登录传了什么手机号、返回是否为空或异常
- watch com.example.dao.UserMapper selectById "{params[0]}" -x 1 —— 确认查的是不是预期 ID,避免误查全表
- watch com.example.service.OrderService calculate "{throwExp}" -e -x 1 —— 捕获静默吞掉的异常,有时慢是因为反复重试失败操作
配合 jad 反编译线上类,还能确认当前运行的字节码是否和你本地提交的一致,排除热部署未生效或版本错乱问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










