arthas 启动失败主因是下载错误jar包,需从github releases获取arthas-boot.jar;attach无响应多因jvm禁用attach机制或权限不足;线上禁用web console可用arthas-client替代;sc/watc

Arthas 启动失败:找不到 arthas-boot.jar 或提示 ClassNotFoundException
常见现象是执行 java -jar arthas-boot.jar 报错,或直接下载的 jar 文件无法运行。根本原因通常是没下对包——Arthas 官方发布页里有多个 jar:arthas-boot.jar 是启动器,arthas-agent.jar 是嵌入式用的,别混淆。
- 从 GitHub Releases 下载最新版
arthas-boot.jar(不是源码 zip,也不是arthas-all.jar) - 确保目标 Java 进程用的是 JDK 8+,且
java命令在 PATH 中可用;Arthas 不支持 JRE 环境 - 如果公司内网限制外网访问,可提前把
arthas-boot.jar拷到服务器,再用java -jar arthas-boot.jar --repo-mirror aliyun加速依赖拉取
attach 到 Java 进程后命令无响应或报 connection reset
这通常不是 Arthas 本身问题,而是 JVM 启动参数或权限挡住了 attach 通道。JDK 9+ 默认禁用 attach 功能,老版本也可能被安全策略拦截。
- 检查目标进程是否加了
-XX:+DisableAttachMechanism,有就去掉——这是最常见“静默失败”原因 - JDK 11+ 需额外确认是否启用
-Djdk.attach.allowAttachSelf=true(尤其在容器中 fork 出的子进程) - Linux 下确保当前用户和目标 Java 进程属同一用户,或具备
ptrace权限(容器中常需加--cap-add=SYS_PTRACE) - 若用
sudo java -jar arthas-boot.jarattach,但目标进程是普通用户启的,会因权限隔离失败
线上环境不能开 web console?用 telnet 或 arthas-client 替代
生产环境出于安全考虑常关闭 Arthas 的 HTTP 端口(默认 3658),但不代表只能放弃交互式诊断。其实命令行终端完全够用,只是得换种连法。
- 启动时加
--no-http-server参数:java -jar arthas-boot.jar --no-http-server,避免监听 3658 端口 - 本地连远程服务:用
telnet host 3658(前提是 3658 开放且未被防火墙拦截) - 更稳妥的方式是用官方
arthas-client:java -jar arthas-client.jar host 3658,它比 telnet 更健壮,能正确处理 ANSI 控制符和 tab 补全 - 注意:
arthas-client和arthas-boot.jar版本必须一致,否则可能 handshake 失败
sc 查不到类、watch 不触发?JVM 类加载器隔离导致的“看不见”
Arthas 的命令基于 JVM 的 Instrumentation API,而类是否可见,取决于目标类是否已被当前线程上下文类加载器加载。Spring Boot 的 LaunchedURLClassLoader、OSGi、模块化系统都可能造成“类存在但 sc 找不到”。
立即学习“Java免费学习笔记(深入)”;
- 先用
vmtool --action getInstances --className java.net.URLClassLoader看有哪些类加载器实例 - 再用
sc -d -c <classloader hash> com.example.XxxService</classloader>指定类加载器查类(hash 从上一步获取) -
watch失效常因方法被内联或 JIT 优化,加-x 3提高遍历深度,或临时用vmtool --action getStaticField确认目标对象是否真在内存中 - Spring Cloud Gateway 等基于 Netty 的应用,handler 方法可能在 eventLoop 线程里,
watch要加-b(before)才捕得到入口调用










