Arthas - mc命令使用详解

关于这篇文章:Arthas 使用技巧与步骤-优快云博客

提到的【动态热修复】,专门总结了一下关于mc命令的使用。

详细使用说明,请参考官方文档:简介 | arthas

解释mc命令

mc(modify class)是Arthas中的“方法更改”命令,用于快速修改类方法体。其实mc代表的是“修改类”的功能,可以在命令行内提供Java代码片段,Arthas会将它编译并立即加载到目标类中。这使得可以在不重启应用程序的情况下,动态修改代码行为。

聪明的小伙伴,可以把它理解成一个内存编译器,用于将Java源代码即时编译为字节码,并通过retransform命令重新加载类。该命令的功能包括生成.class文件并支持热更新。

mc命令用途

mc命令能用于动态代码注入,它可以帮助创建一个“内存木马”。可通过参数 -c 来指定类加载器,-d 用于指定输出目录。命令语法为:

# mc -c:指定类加载器 -d:指定编译后字节码输出目录 JavaSourceFiles:修改的java文件列表
mc [-c <classloader>] [-d <output-dir>] <JavaSourceFiles>

下面是一些常用的命令指南

mc命令详细指南

1. mc 概述与原理

  • 定位mc 是 Arthas 在“类命令”一栏中提供的“Memory Compiler”命令,用于**将 .java 源文件在目标 JVM 内存中编译为 .class

  • 原理:它基于 JDK 提供的 javax.tools.JavaCompiler API,遍历当前应用的类路径和依赖 JAR,将源码编译,并生成字节码,然后存放在内存中或指定目录。

  • 热更新配合:通常编译完成后,结合 retransform(或 redefine)命令,将新生成的字节码热加载到 JVM,完成线上代码替换而无需重启服务

2. 基本用法

# 将 /tmp/Test.java 编译成字节码,输出到内存(默认位置)
mc /tmp/Test.java
  • 这条命令会在内存中生成 Test.class,但不会写入磁盘。

# 指定输出目录,将编译后的 .class 写入磁盘
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
  • -d 参数后接目录路径,可将多个源码文件一起编译并输出。

# 指定 ClassLoader(通过 ID)
mc -c 327a647b /tmp/Test.java
# 或者通过 ClassLoader 类型全名
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
  • -c--classLoaderClass 可精确指定要使用的 ClassLoader,避免编译后的类载入到错误的 ClassLoader 中。

3. 与热更新命令配合(典型流程)

  1. 反编译原码

    jad --source-only com.example.MyService > /tmp/MyService.java
    

    获取线上运行的源码。

  2. 修改源码
    /tmp/MyService.java 中修正逻辑,比如打印、修复 bug。

  3. 内存编译

    mc /tmp/MyService.java -d /tmp
    

    将修改后的源码编译为字节码,并输出到 /tmp/com/example/MyService.class

  4. 热加载

    retransform /tmp/com/example/MyService.class
    

    或者

    redefine /tmp/com/example/MyService.class
    

    将新字节码注入 JVM,线上生效,无需重启。

4. 典型线上场景示例

场景:线上某业务方法逻辑有 bug,需要快速验证修复,而不重启服务。

# 1. 下载启动 Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

# 2. 反编译目标类
jad --source-only com.app.biz.OrderService > /tmp/OrderService.java

# 3. 编辑修复,保存 /tmp/OrderService.java

# 4. 内存编译并输出到 /tmp
mc /tmp/OrderService.java -d /tmp

# 5. 热更新到 JVM
retransform /tmp/com/app/biz/OrderService.class

# 6. 验证接口
curl http://127.0.0.1:8080/order/test
  • 此流程在生产环境中可在几分钟内完成修复验证citeturn6view0。

5. 常见注意事项

  1. JDK vs JRE
    mc 依赖 javax.tools.JavaCompiler必须在 JDK 环境下运行,JRE 会报 “Cannot load Java Compiler”。

  2. 编译失败或依赖缺失

    • 如果源码引用第三方类,mc 会根据当前 ClassLoader 搜索依赖;若找不到,编译失败。

    • 可先在本地用 javac 完整编译,或用 -classpath 参数手动指定 classpath(高级用法)。

  3. ClassLoader 匹配

    • 默认情况下 mc 使用当前 Shell 会话所附加的 ClassLoader,若要修改 Web 应用下的 Spring Boot 加载器,需用 -c/--classLoaderClass 明确指定。

  4. 不支持新增字段或方法
    redefine/retransform 均不允许新增类的字段或方法,仅支持修改现有方法体

  5. 安全与风险

    • 线上热更新风险较大,只应在紧急场景下使用,并在验证通过后进行正式发布。

    • 完成诊断后,执行 reset 命令恢复所有增强,或 stop 退出 Arthas,以清理临时字节码。

6. 最佳实践

  • 预先校验:将源码在本地或测试环境先用 mc+retransform 验证再线上操作。

  • 脚本化流程:将上述命令封装入脚本,减少手动输入风险。

  • 日志与审计:记录所有 mcretransform 操作及输出目录,便于事后审计和回滚。

  • 限流监控:在高并发场景下,先限流再热更新,防止线上抖动。


通过上述讲解,你可以从原理到实战全方位掌握 Arthas mc 命令的使用,做到“无需重启、快速定位、即时修复”。

### 关于 Arthas Tunnel Server 的使用 #### 启动 Arthas Tunnel Server Arthas Tunnel Server 是一个基于 Spring Boot 的 Fat Jar 应用程序,可以直接通过 `java -jar` 命令启动。以下是具体的启动方式: ```bash java -jar -Dserver.port=8080 -Darthas.server.port=7777 arthas-tunnel-server-3.7.1-fatjar.jar [^2] ``` 在此命令中: - `-Dserver.port=8080` 表示 HTTP API 接口监听的端口号设置为 8080。 - `-Darthas.server.port=7777` 表示 WebSocket 隧道服务监听的端口号设置为 7777。 如果版本不同,也可以参考其他版本的启动方法,例如: ```bash java -jar arthas-tunnel-server-3.6.0-fatjar.jar [^3] ``` 此命令默认会使用内置的配置项来运行服务器。 --- #### 在 Arthas 中连接到 Tunnel Server 当启动 Arthas 并希望将其连接至远程部署的 Tunnel Server 时,可以通过传递 `--tunnel-server` 参数实现: ```bash as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' [^1] ``` 上述命令中的 `ws://127.0.0.1:7777/ws` 即为目标 Tunnel Server 的地址和路径。 --- #### 使用 Spring Boot YML 文件配置 Arthas Tunnel Server 对于更复杂的场景,可以在 Spring Boot 的 YAML 配置文件中指定 Arthas Tunnel Server 的相关信息。以下是一个典型的配置示例: ```yaml arthas: tunnel-server: ws://127.0.0.1:7777/ws agent-id: 1020uadfj [^4] ``` 其中: - `tunnel-server` 定义了目标隧道服务器的 URL 地址。 - `agent-id` 则用于唯一标识当前客户端实例。 --- #### 总结 Arthas Tunnel Server 提供了一种灵活的方式支持分布式环境下的调试需求。无论是通过命令行还是配置文件的形式,都可以轻松完成与 Tunnel Server 的集成工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值