Arthas 是阿里巴巴开源的 Java 诊断工具,支持不重启、不改代码实时诊断、方法追踪、JVM 监控和类热更新;在 Docker 中需配置 --cap-add=SYS_PTRACE、-XX:+StartAttachListener 并确保基础环境兼容。

Arthas 是阿里巴巴开源的 Java 诊断工具,支持在不重启、不修改代码的前提下,对线上运行的 Java 应用进行实时诊断、方法追踪、JVM 监控和类热更新(redefine)。在 Docker 容器中使用 Arthas 需要特别注意权限、路径、JVM 进程可见性及容器网络隔离等问题。核心思路是:让 Arthas 能 attach 到目标 JVM 进程,并提供可交互的终端或 Web 控制台。
确保容器内具备 Arthas 运行环境
Arthas 不依赖 JDK 编译环境,但需要与目标 JVM 版本兼容(推荐使用 JDK 8+),且需有基础 Linux 工具(如 curl、bash、ps)支持。建议在基础镜像中预装 Arthas,或在启动时动态下载:
- 推荐方式:构建镜像时 COPY Arthas 全量包(如 arthas-bin.zip)并解压到固定路径(如 /opt/arthas)
- 临时方式:容器启动后执行 curl -O https://arthas.aliyun.com/arthas-boot.jar,但需确保容器能访问外网且有 curl
- 注意:Alpine 镜像默认无 bash,需安装 bash 或改用 sh 启动脚本;Arthas 的 arthas-boot.jar 在 Alpine 上可能因缺少 glibc 报错,建议优先使用 openjdk:slim 等 Debian/Ubuntu 基础镜像
让 Arthas 能 attach 到目标 Java 进程
Docker 默认以 PID namespace 隔离,容器内 ps 只能看到本容器进程,但 Arthas attach 要求目标 JVM 进程对 attach 工具“可见”。关键配置如下:
- Java 启动参数中必须启用 -Djava.security.manager 以外的 attach 权限(JDK 8u191+ 默认关闭 attach,需显式加 -XX:+StartAttachListener)
- 容器启动时添加 --cap-add=SYS_PTRACE(必需!否则 attach 会报 “Operation not permitted”)
- 避免使用 --pid=host(不安全),应保持容器 PID namespace 隔离,仅通过 SYS_PTRACE 授权即可
- 若 Java 进程以非 root 用户运行(推荐),需确保该用户对 Arthas 目录有读写权限,且 arthas-boot.jar 与目标 JVM 属于同一用户(否则 attach 可能失败)
常用操作:热更新类(redefine)与在线排查
Arthas 的 redefine 命令支持加载已编译的 .class 文件替换线上类(仅限方法体变更,不支持新增/删除字段或方法签名变化)。典型流程如下:
立即学习“Java免费学习笔记(深入)”;
- 将修改后的 .class 文件(确保与原类完全同包同名,且已用相同 JDK 编译)拷贝进容器:docker cp MyClass.class <container-id>:/tmp/
- 进入容器:docker exec -it <container-id> /bin/bash
- 启动 Arthas 并 attach:java -jar /opt/arthas/arthas-boot.jar → 选择目标 Java 进程 ID
- 执行热更新:redefine /tmp/MyClass.class,成功则提示 “redefine success”
- 排查场景示例:watch com.example.Service doWork returnObj 观察返回值;trace com.example.Controller handle -n 5 追踪前 5 次调用链;vmtool --action getInstances --className java.lang.String --limit 10 查看堆中实例
远程诊断:暴露 Arthas Web Console(可选)
Arthas 内置 Web 控制台(默认端口 8563),适合团队协同排查。需在容器中开放该端口并配置访问控制:
- 启动 Arthas 时加参数:java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server-ip:7777' --agent-id xxx(对接 Arthas Tunnel Server 实现统一管理)
- 若直接暴露 Web:java -jar arthas-boot.jar --http-port 8563 --telnet-port 3658,并在 docker run 时加 -p 8563:8563
- 生产环境务必设置密码:--session-timeout 300 --arthas-config /opt/arthas/arthas.properties,其中配置 arthas.http.password=xxx
- 注意:Web 控制台依赖嵌入式 Jetty,内存占用略高,低配容器慎用;建议仅调试时开启,排查完即停
Arthas 在 Docker 中不是开箱即用,但只要配好 SYS_PTRACE、JVM 启动参数和基础环境,就能稳定支撑线上热更新与深度诊断。关键是把容器当成“轻量虚拟机”来信任,而非完全黑盒。


















