照着这篇做,你能在不重启、不改代码的前提下,用 Arthas 把线上 Java 进程的 CPU 飙高、接口变慢、日志不生效、代码版本对不上这几类问题现场定位到具体方法行。
第一步:把 Arthas 挂到目标进程上
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
回车后会列出机器上所有 Java 进程,输入序号再回车即可。也可以直接指定 PID:
java -jar arthas-boot.jar 12345
注意:Arthas 必须用和目标进程相同的系统用户启动,否则 attach 会失败。容器里排查用 docker exec -it <容器> java -jar arthas-boot.jar,镜像里没有 jps 也没关系,Arthas 会自己扫 /proc 找 Java 进程。
第二步:dashboard 先看全局
进入交互界面后第一条命令永远是它:
dashboard
默认每 5 秒刷新一次,重点看三块:线程区按 CPU 排序、内存各区使用率、GC 次数与耗时。想只输出一次用于观察快照,加 -n 1。
接着缩小到线程:
thread -n 3 # 最忙的三个线程及其堆栈
thread -b # 直接告诉你哪两个线程在互相等锁
注意:thread -b 只能发现 synchronized 死锁,ReentrantLock 造成的死锁它看不出来,这种情况要 thread --all 翻线程栈或直接 jstack 导出分析。
第三步:用 trace 找慢在哪个子调用
trace com.example.service.OrderService createOrder
它会打印方法内部的调用树和每一层耗时,一眼看出是查库慢还是下游 RPC 慢。生产环境务必加限制:
trace com.example.service.OrderService createOrder '#cost > 100' -n 10
表示只抓耗时超过 100ms 的调用,最多 10 次。
注意:trace 是字节码增强,有明显性能开销,不要长时间挂着。排查完一定要 stop 退出,别留在生产上过夜。
第四步:用 watch 看真实入参出参
watch com.example.service.OrderService createOrder \
'{params, returnObj, throwExp}' -x 3
-x 3 是结果展开深度,集合类打印不全就把数字调大。条件过滤更实用:
watch com.example.service.OrderService createOrder \
'{params, returnObj}' 'params[0] == 1001' -x 3
-b 看方法进入前,-s 看正常返回,-e 只在抛异常时输出。
第五步:jad / sc 确认跑的是哪份代码
“改了怎么没生效”这类问题,八成是发版没上或者类被别的 ClassLoader 加载了:
jad com.example.service.OrderService
sc -d com.example.service.OrderService
jad 反编译线上真实加载的字节码,sc -d 看 ClassLoader 和来源 jar 路径。
注意:同名类被多个 ClassLoader 加载时,记下 sc -d 输出的 classLoaderHash,后面做热替换必须用 -c <hash> 带上,否则改了也不生效。
第六步:偶发问题用 tt 录像回放
一次只错一下、复现不了的情况:
tt -t com.example.service.OrderService createOrder -n 20
tt -l # 列出记录
tt -i 1003 -p # 重放第 1003 次调用的参数
相当于给方法调用装了行车记录仪,事后回放现场。
顺手记几个高频命令
logger --name com.example --level DEBUG:临时调日志级别,不用重启。
profiler start / profiler stop --format html:生成火焰图。
heapdump /tmp/dump.hprof:导出堆快照。
stop 退出当前会话,shutdown 关掉所有 Arthas 服务端。
小结
arthas-boot.jar 挂载目标进程,注意同用户启动与容器环境。
- 先
dashboard 看全局,再 thread -n / thread -b 锁定线程。
trace 找慢点、watch 看参数,生产环境必须加 -n 和条件过滤。
jad + sc -d 验证线上代码版本与 ClassLoader。
- 偶发问题用
tt 抓现场回放。
- 排查结束立刻
stop,字节码增强不要长期挂着。