Arthas 启动失败主因是JDK版本不匹配或环境变量缺失,需用目标应用同版本JDK显式启动;attach失败多因禁用Attach机制或权限不足;sc/watch失效常因类未加载或JIT优化;Web Console不通通常因端口、防火墙或Nginx未透传WebSocket头。

Arthas 启动失败:找不到 java 或提示 UnsupportedClassVersionError
Arthas 是基于 Java 编写的,必须由目标 JVM 的同一套 JDK 启动,否则会因字节码版本不匹配或环境变量缺失直接退出。
常见错误现象:bash: java: command not found、java.lang.UnsupportedClassVersionError: org/apache/arthas/boot/Bootstrap has been compiled by a more recent version of the Java Runtime。
- 确认
arthas-boot.jar启动时用的是目标应用所用的 JDK —— 不是本地开发机的 JDK,也不是系统 PATH 里的默认java - 显式指定 JDK 路径启动:
/path/to/jdk11/bin/java -jar arthas-boot.jar(JDK 版本需 ≥ 目标应用运行版本) - 如果目标应用跑在容器里,Arthas 必须进到容器内部执行;宿主机的
java对容器内进程无效
attach 失败:Process not found 或 Unable to open socket file
Arthas 通过 JVM 的 Attach API 连接目标进程,这依赖 tools.jar(JDK)或 lib/tools.jar(某些 OpenJDK 构建),且要求目标 JVM 开启了 attach 功能。
常见错误现象:Process not found(PID 确实存在但搜不到)、Unable to open socket file: target process not responding or HotSpot VM not loaded。
立即学习“Java免费学习笔记(深入)”;
- 检查目标 JVM 是否禁用了 attach:确认未加
-XX:+DisableAttachMechanism参数(加了就彻底无法 attach) - OpenJDK 8u212+ / JDK 11+ 默认关闭 attach,需额外加
-XX:+StartAttachListener启动目标应用(生产环境建议提前加好) - Linux 下若目标进程 UID 和当前用户不同,且未开启
sudo权限,attach 会被拒绝;可用sudo -u $APP_USER java -jar arthas-boot.jar切换用户再试
sc 查不到类、watch 无响应:字节码增强失败或类未加载
Arthas 的很多命令(如 watch、trace、tt)依赖对类进行动态字节码增强,前提是类已加载且未被 JIT 优化掉关键行号信息。
常见错误现象:sc com.example.UserService 返回空、watch com.example.UserService login '{params,returnObj}' -x 2 无输出、或报 enhance failed。
- 先用
vmtool --action getInstances --className com.example.UserService确认类是否已加载(避免查错类名或包名) - Spring Boot 应用中,类可能延迟加载(如 @Lazy Bean),需先触发一次业务调用,再执行
sc - JDK 8 默认开启
-XX:+UseCompressedOops,但某些 Arthas 版本在该配置下增强失败;可临时加-XX:-UseCompressedOops测试(仅调试用) - 避免对
static final字段或private static方法使用watch,它们常被 JIT 内联或优化掉行号
线上环境连不上 Arthas Web Console:端口不通或 WebSocket 升级失败
Arthas 启动时默认开启 Web Console(--tunnel-server 或内置 HTTP Server),但生产防火墙、反向代理、Nginx 配置常拦截 WebSocket 升级请求。
常见错误现象:浏览器打开 http://ip:8563 页面白屏、控制台报 WebSocket connection to 'ws://...' failed、Nginx 日志出现 400 Bad Request。
- 确认 Arthas 启动时加了
--web-port 8563,且目标机器上该端口未被占用、防火墙放行(iptables -L | grep 8563) - 若经 Nginx 反代,必须显式透传 WebSocket 头:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade"; - Web Console 依赖目标 JVM 的网络出向能力 —— 如果应用部署在严格隔离的 VPC 内网,且没配 DNS 或 outbound 白名单,
tunnel-server模式会静默失败
Arthas 的 attach 机制和字节码增强都高度依赖 JVM 实现细节,同一个命令在 JDK 8u292 和 JDK 17 上行为可能不同;线上首次使用前,务必在预发环境用相同 JDK 和启动参数完整走一遍 attach → sc → watch 流程。别等到告警才试。










