Skip to content
On this page

Java线上排错神器Arthas实战指南:无需重启,搞定80%线上疑难问题

### 前言

线上Java应用最头疼的问题是什么?

接口偶尔超时、参数传递异常、第三方接口调用失败、方法返回值诡异、CPU突高、内存泄漏…

传统排查方式:打日志、重新打包、重启服务、等待复现,不仅流程繁琐,还会影响线上业务稳定性。

Arthas(阿里开源Java诊断工具)完美解决了这个痛点:无需修改代码、无需重启服务、无侵入,实时监控方法入参、返回值、异常、执行耗时,精准定位线上问题根源,是后端开发者必备的线上排错神器。

本文结合真实业务实操场景,从零讲解Arthas安装、基础命令、高频实战技巧,重点解决大家最常用的「监控方法内部调用、排查第三方HTTP请求异常」场景,看完直接上手落地。


一、Arthas 核心优势

  • 无侵入诊断:基于Java Agent字节码增强,不修改业务代码、无需重启服务

  • 功能全覆盖:支持方法监控、耗时追踪、线程排查、内存分析、热更新代码

  • 轻量高效:Jar包体积小,低性能损耗,适配生产环境

  • 落地性强:专治线上偶现bug、接口超时、参数异常、第三方调用失败等疑难问题


二、快速安装与启动(生产通用)

1. 下载Arthas启动包

服务器直接执行命令下载,一次下载永久使用:

bash
curl -O https://arthas.aliyun.com/arthas-boot.jar

2. 启动并挂载Java进程

bash
java -jar arthas-boot.jar

执行后会列出当前服务器所有Java进程,输入目标业务进程序号,回车,即可进入Arthas交互式控制台。

小贴士:生产环境建议避开流量高峰期操作,Arthas挂载对服务性能损耗极低,可放心使用。

3. 退出命令

  • 临时退出控制台:quit(保留挂载进程)

  • 彻底关闭Arthas:stop(释放资源,结束挂载)


三、核心实战:Watch命令(最常用、最实用)

watch 是Arthas使用率最高的命令,核心作用:实时监控方法入参、返回值、异常、执行链路

很多新手只会监控外层方法,却不会排查方法内部调用的第三方接口,这也是线上排查的核心痛点,下面结合真实业务场景手把手教学。

场景背景

业务类:com\.demdm\.app\.module\.auth\.service\.AuthCodeService

业务方法:requestUserAccount

问题:该方法内部通过 restTemplate\.exchange 调用第三方HTTP接口,偶现调用失败、返回数据异常,日志打印不全,无法定位问题。

1. 基础监控:外层业务方法

先监控外层方法的完整执行信息(入参、返回值、异常),快速判断方法本身是否异常:

bash
watch com.demdm.app.module.auth.service.AuthCodeService requestUserAccount '{params,returnObj,throwExp}' -x 3

参数解析

  • params:捕获方法所有入参

  • returnObj:捕获方法返回值

  • throwExp:捕获方法抛出的所有异常

  • \-x 3:展开对象3层嵌套(解决参数/返回值对象嵌套看不到详情问题)

2. 高阶实战:监控方法内部 RestTemplate 调用

重点!!!外层方法无报错,但内部第三方HTTP请求异常,直接监控内部的 restTemplate\.exchange 方法,精准抓取请求全量信息:

通用监控(全局捕获)

bash
watch org.springframework.web.client.RestTemplate exchange '{params,returnObj,throwExp}' -x 3

精准监控(只捕获当前业务类调用)

避免监控到项目中其他模块的RestTemplate请求,精准过滤目标业务调用:

bash
watch org.springframework.web.client.RestTemplate exchange '{params,returnObj,throwExp}' -x 3 -n 10 'clazz@class.name.contains("AuthCodeService")'

执行后可获取的核心信息

  • 第三方接口真实请求URL、请求方式(GET/POST)

  • 完整请求头、请求体参数

  • 接口响应状态码、响应体数据

  • HTTP调用超时、连接异常、参数不匹配等报错信息

3. Watch常用过滤技巧

bash
# 只监控执行耗时超过100ms的请求(排查接口超时)
watch 全类名 方法名 '{params,returnObj}' 'cost>100' -x 3

# 只监控抛出异常的请求(专注排查报错)
watch 全类名 方法名 '{params,throwExp}' -e -x 3

# 只捕获10次请求后自动停止(避免日志刷屏)
watch 全类名 方法名 '{params,returnObj}' -n 10 -x 3


四、Arthas 高频实用命令(线上必备)

1. trace:追踪方法内部耗时(解决接口超时)

精准定位方法内部哪一段代码、哪个外部调用耗时最长,专治接口慢查询、超时问题:

bash
trace com.demdm.app.module.auth.service.AuthCodeService requestUserAccount

2. dashboard:JVM全局监控面板

实时查看CPU、内存、线程、GC状态,快速排查服务卡顿、CPU飙高、频繁GC问题:

bash
dashboard

3. thread:定位CPU飙高线程

bash
# 查看最繁忙的3个线程堆栈
thread -n 3

4. jad:线上反编译代码

直接反编译线上运行的class文件,确认线上代码是否和本地一致,解决「本地正常线上异常」问题:

bash
jad com.demdm.app.module.auth.service.AuthCodeService

5. redefine:热更新代码

紧急线上bug无需重启服务,直接替换class文件热修复,快速恢复业务:

bash
redefine /tmp/修改后的类.class

五、真实线上排查案例总结

案例1:第三方接口偶现返回空值

问题:业务方法无报错,但数据偶尔缺失,日志无详细记录

排查方案:watch监控RestTemplate.exchange,发现第三方接口偶尔返回502,无重试机制导致数据为空

解决方案:添加接口重试、异常兜底逻辑

案例2:接口间歇性超时

问题:接口大部分时间正常,偶尔超时告警

排查方案:trace追踪方法耗时,定位是第三方HTTP接口响应不稳定导致

解决方案:优化超时时间、增加熔断降级策略

案例3:参数传递异常

问题:业务逻辑判断异常,找不到参数问题

排查方案:watch捕获方法入参,发现前端传递空参数未做校验


六、使用注意事项(生产必看)

  1. 避免长时间监控:问题定位后及时stop/quit,长期监控会产生大量日志

  2. 展开层数适度:常规场景用\-x 3,嵌套极深的对象再调到4,层数过高会刷屏

  3. 精准过滤:多模块项目尽量添加类名、次数过滤,避免监控无关请求

  4. 禁止线上随意热更新核心类:热更新仅用于紧急bug修复,更新后需后续版本迭代固化代码


七、总结

Arthas 之所以成为Java开发者的线上排错神器,核心就是高效、无侵入、全覆盖

掌握核心用法:

  • 参数/返回值异常 → watch 命令

  • 接口超时、耗时过长 → trace 命令

  • CPU、线程异常 → dashboard + thread 命令

  • 线上代码不一致 → jad 反编译

  • 紧急bug修复 → redefine 热更新

尤其是监控方法内部第三方调用的实操技巧,完美解决了线上日志不全、无法定位外部接口问题的痛点,日常开发、线上运维都能高频复用。

(注:文档部分内容可能由 AI 生成)

上次更新于: