Arthas是阿里巴巴开源的无侵入式Java诊断工具,支持不重启、不改代码动态监控JVM、追踪方法耗时、查看线程堆栈、热更新类及实时观察参数返回值,适用于CPU飙升、内存泄漏、接口慢等线上问题快速定位。

Java 应用线上出问题时,Arthas 是最实用的诊断工具之一——它不需要重启、不侵入代码、支持热查看和热修改,特别适合生产环境快速定位问题。
快速接入 Arthas(无需改代码)
Arthas 是一个 Java 诊断工具,以 agent 方式 attach 到目标 JVM 进程,完全独立于应用本身:
- 下载启动脚本:
curl -O https://arthas.aliyun.com/arthas-boot.jar - 执行 attach:
java -jar arthas-boot.jar,会列出当前用户有权限的 Java 进程,输入对应 PID 即可连接 - 连接成功后进入交互式终端,支持 Tab 补全和命令历史
如果线上机器无法外网下载,可提前将 arthas-boot.jar 或完整包上传到服务器;容器环境(如 Kubernetes)可通过 kubectl exec 进入 Pod 后执行。
高频诊断场景与对应命令
遇到具体问题时,按现象选命令,避免盲目排查:
立即学习“Java免费学习笔记(深入)”;
-
接口响应慢? 用
trace com.example.service.UserService login查看方法内部耗时分布,支持 -n 限制采样次数,避免影响性能 -
某个方法没调用或返回异常? 用
watch com.example.controller.OrderController createOrder '{params,returnObj,throwExp}' -x 3实时观察入参、返回值和异常,-x 控制结果展开深度 -
线程卡死或 CPU 飙高? 先
thread -n 5查 CPU 占用最高的前 5 个线程,再thread [id]看其完整堆栈;配合thread -b快速定位阻塞点(如 synchronized 等待) -
想确认某行代码是否执行? 用
ognl '@java.lang.System@out.println("hit!")'或更安全的sc -d *Controller检查类是否已加载
安全可控地做线上调优与热修复
Arthas 支持运行时修改行为,但务必谨慎操作:
- 用
vmtool --action getstatic --className java.lang.String --fieldName CASE_INSENSITIVE_ORDER查看静态字段值,辅助分析常量配置 - 通过
jad反编译指定类验证实际加载的字节码(注意混淆后可能不可读),再用mc+redefine热更新 class(仅限方法体变更,不支持新增/删除字段或方法签名) - 所有执行命令默认记录在
~/logs/arthas/arthas.log,可回溯操作痕迹;建议开启--session-replay自动保存会话
热更新前务必确认类加载器一致性(sc -d 查 classLoaderHash),避免 redefine 失败;生产环境建议先在预发验证。
结合日志与监控提升诊断效率
Arthas 不是万能的,需和其他手段配合:
- 用
logger --name root --level debug动态调整日志级别,临时打开关键模块 DEBUG 日志,排查完再调回 - 配合 Prometheus + Grafana 查看 JVM 指标(如 GC 频率、堆内存趋势),若发现频繁 FullGC,再用
jvm或vmtool深挖对象分配热点 - 对分布式链路,可先用
trace -j(开启 JDK 代理模式)捕获更细粒度调用,再结合 traceId 关联上下游日志
Arthas 的价值在于把“猜”变成“看”,重点不是记住所有命令,而是建立“现象→命令→证据”的条件反射。


















