Arthas+IDEA 实战:Java 线上问题排查与 Spring Boot 落地
基于 Spring Boot 项目实战,介绍使用 Arthas 和 IDEA 进行线上问题排查的完整流程。涵盖接口超时、隐藏异常、内存泄漏及类加载冲突四大高频场景。通过 Arthas 命令实时监控 JVM 状态与方法调用,结合 IDEA 源码分析与远程调试,实现从定位到修复的闭环。提供常用命令速查表及避坑指南,帮助开发者在不重启服务的前提下高效解决线上故障,提升系统稳定性。

基于 Spring Boot 项目实战,介绍使用 Arthas 和 IDEA 进行线上问题排查的完整流程。涵盖接口超时、隐藏异常、内存泄漏及类加载冲突四大高频场景。通过 Arthas 命令实时监控 JVM 状态与方法调用,结合 IDEA 源码分析与远程调试,实现从定位到修复的闭环。提供常用命令速查表及避坑指南,帮助开发者在不重启服务的前提下高效解决线上故障,提升系统稳定性。

在 Spring Boot 项目线上运维中,常面临'日志不全定位难''复现环境搭不通''线上故障不敢乱重启'的痛点。Arthas 作为阿里开源的 Java 诊断工具,能在不重启服务、不侵入代码的前提下,实时监控 JVM 状态、追踪方法调用、排查异常与内存问题;结合 IDEA 的源码关联与远程调试能力,可形成'线上定位→源码分析→问题复现→解决方案'的闭环。
Arthas 支持 Linux/Mac/Windows 环境,针对线上 Spring Boot 项目(以 Linux 服务器为例),部署流程如下:
# 1. 下载 Arthas 压缩包(推荐稳定版 3.7.2,适配 JDK8-17)
wget https://arthas.aliyun.com/arthas-boot.jar
# 2. 启动 Arthas,指定线上 Spring Boot 进程(通过 jps 命令获取进程 ID)
jps -ml | grep community-repair
java -jar arthas-boot.jar <PID>
实战技巧:线上服务器若有防火墙,无需额外开放端口(Arthas 默认通过本地交互,也可配置 telnet/http 端口远程连接);建议将 Arthas 启动命令封装为脚本,故障时快速启动。
Arthas 的核心是'线上数据采集',IDEA 负责'源码分析与问题复现',两者联动需做好两点配置:
>> 将输出写入日志文件:trace com.community.controller.RepairController * >> /tmp/arthas-trace.log。踩坑提醒:初期未同步代码版本,Arthas 定位到的方法行号与本地 IDEA 不一致,导致分析偏差;解决方法是发布前标记 Git 版本号,线上故障时按版本号拉取对应源码。
用户提交报修单时,部分请求超时返回 504,日志仅记录'接口耗时过长',无具体方法耗时明细。
trace 命令追踪指定类的所有方法,输出耗时超过 50ms 的调用,并显示行号。
trace com.community.controller.RepairController submitRepair -j -n 5 --cost-time 50
结果显示 repairService.assignWorker() 方法耗时平均 1.8s,占比 90% 以上。assignWorker() 方法,发现内部调用了 locationService.getNearbyWorkers(),且未做缓存——高峰期大量请求重复查询数据库。
trace 接口,assignWorker() 方法耗时降至 80ms 以内。进一步验证可用 watch 命令监控方法的参数与返回值:
watch com.community.service.RepairService assignWorker "{params, returnObj, costTime}" -x 2
少量用户反馈'提交报修单成功,但刷新后无记录',日志未打印任何异常,排查数据库发现无对应数据。
watch 命令监控异常信息,-e 仅监控异常情况。
watch com.community.service.RepairService saveRepairOrder "{params, throwExp}" -e -x 3
捕获到 SQLIntegrityConstraintViolationException,原因是订单编号生成存在并发问题,导致偶发重复,事务回滚但未打印日志。线上验证可用 monitor 命令监控方法异常率:
monitor com.community.service.RepairService saveRepairOrder -c 10
JVM 老年代内存缓慢增长,连续 3 天凌晨触发内存预警,重启服务后恢复,但无法确定泄漏对象。
dashboard 命令查看 JVM 整体状态,确认老年代持续增长。
dashboard -i 5
导出堆内存快照:
heapdump /tmp/arthas-heapdump.hprof
com.community.cache.LocalCache 类持有大量 RepairOrder 对象引用,且该缓存无过期策略。LocalCache 添加过期策略(基于 LRU 算法,缓存上限 1000 条,过期时间 1 小时)。ognl 命令手动清理缓存,验证内存回收。ognl "@com.community.cache.LocalCache@clear()"
集成某短信 SDK 后,约 10% 用户提交报修单后收不到验证码,日志显示'短信发送成功',但实际未送达,排查发现是 SDK 内部依赖的 HttpClient 版本与项目冲突。
sc 命令查看类的加载器、全路径、实例数。
sc -d org.apache.http.client.HttpClient
结果显示存在两个版本的 HttpClient,分别由 AppClassLoader(项目依赖 3.1 版本)和 PluginClassLoader(SDK 自带 4.5 版本)加载。pom.xml,通过'Dependency Analyzer'插件查看依赖树。HttpClient,强制使用项目的 3.1 版本。<dependency>
<groupId>com.sms.sdk</groupId>
<artifactId>sms-client</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
sc 命令确认,仅存在项目依赖的 HttpClient 版本,短信发送正常。| 命令 | 核心用途 | 实战示例 |
|---|---|---|
| trace | 追踪方法调用链路,定位超时 | trace com.community.controller.RepairController submitRepair --cost-time 50 |
| watch | 监控方法参数、返回值、异常 | watch com.community.service.RepairService saveRepairOrder "{params, throwExp}" -e |
| monitor | 统计方法调用指标(成功率、耗时) | monitor com.community.service.RepairService assignWorker -c 10 |
| dashboard | 实时监控 JVM 状态 | dashboard -i 5 |
| heapdump | 导出堆快照,排查内存泄漏 | heapdump /tmp/arthas-heapdump.hprof |
| sc/jad | 查看类加载信息、反编译类 | sc -d org.apache.http.client.HttpClient;jad com.community.service.RepairService |
trace com.community.* *,导致线上服务 CPU 飙升。-n 限制捕获次数,排查完成后及时退出 Arthas(执行 quit 命令)。heapdump 命令,提示磁盘空间不足。df -h 查看磁盘空间,选择空间充足的目录;若仅需分析特定对象,用 heapdump --live 导出仅存活对象的快照。java -jar arthas-boot.jar 时,提示'Permission denied'。su - appuser)启动 Arthas,或用 sudo 命令提升权限。结合实战经验,Java 线上问题排查可遵循以下闭环流程:
Arthas 的核心价值是'不侵入、不重启',IDEA 则提供了强大的源码分析与复现能力,两者结合能最大化提升线上故障排查效率。对于 Spring Boot 项目而言,掌握这套流程,能从容应对接口超时、隐藏异常、内存泄漏等高频问题,减少故障排查时间,提升服务稳定性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online