当前位置: 首页 > news >正文

Agent使用

目录
  • Agent使用
    • 关键类:Instrumentation
      • Instrumentation 的主要功能
    • Java Agent 技术的核心意义
    • 使用规则
      • 规则总结
    • 标准目录结构
    • Agent实现热更
    • Agent 使用示例
      • Agent 类示例
      • Maven 配置
      • 打包后测试
        • 检查 JAR 包配置
        • 测试 premain
        • 测试 agentmain

Agent使用

关键类:Instrumentation

Instrumentation 的主要功能

功能 描述 应用场景
redefineClasses 替换类的字节码 热修复、功能更新
retransformClasses 重新应用转换器 动态启用监控
addTransformer 注册字节码转换器 APM、日志增强
getAllLoadedClasses 获取所有已加载类 类分析、诊断
getObjectSize 计算对象大小 内存分析
setNativeMethodPrefix 拦截 native 方法 native 方法监控

总结Instrumentation 确实是 Java 平台上最强大的工具之一,它提供了在运行时修改和监控 Java 程序的底层能力,是很多高级工具(如 APM、热修复、诊断工具)的技术基础。

Instrumentation 确实是 Agent 技术的核心接口

// 1. 🔥 核心接口 - 功能入口
java.lang.instrument.Instrumentation// 2. 🔥 核心类 - 字节码转换
java.lang.instrument.ClassFileTransformer// 3. 🔥 核心类 - 类定义
java.lang.instrument.ClassDefinition// 4. 🔥 核心工具 - 动态附加
com.sun.tools.attach.VirtualMachine

Java Agent 技术的核心意义

维度 传统方式 Agent 增强方式 意义
问题诊断 靠猜+日志 实时观测 效率提升10倍+
故障恢复 重启应用 热修复 业务零中断
系统监控 外部指标 内部状态 从黑盒到白盒
成本控制 高人力成本 自动化诊断 成本大幅降低
用户体验 服务中断 持续可用 体验大幅提升
技术债务 难以处理 动态增强 延长系统寿命

本质上,Agent 技术让 Java 应用从"静态的、需要重启的"变成了"动态的、可实时操作的",这是运维和开发模式的革命性进步。

Arthas已经成为agent的代名词直接使用 Arthas 就够了直接用arthas就行,不用我们自己写了,arthas够用。直接用 Arthas,除非你有非常特殊的定制化需求!

使用规则

  1. 方法签名规则

    // premain 方法签名
    // 标准签名(推荐)
    public static void premain(String agentArgs, Instrumentation inst)
    // 简化签名(可选)
    public static void premain(String agentArgs)// agentmain 方法签名
    // 标准签名(推荐)
    public static void agentmain(String agentArgs, Instrumentation inst)
    // 简化签名(可选)
    public static void agentmain(String agentArgs)
    
  2. MANIFEST.MF 配置规则(关键!)

    # META-INF/MANIFEST.MF# premain 必须配置
    Premain-Class: com.example.MyAgent# agentmain 必须配置  
    Agent-Class: com.example.MyAgent# 热更相关能力
    Can-Redefine-Classes: true
    Can-Retransform-Classes: true# 动态附加需要
    Can-Attach: true
    
    # 完整的 MANIFEST.MF 示例
    Manifest-Version: 1.0
    Premain-Class: com.example.HotFixAgent
    Agent-Class: com.example.HotFixAgent
    Can-Redefine-Classes: true
    Can-Retransform-Classes: true
    Can-Attach: true
    Boot-Class-Path: your-agent.jar
    Created-By: 1.8.0_292 (Oracle Corporation)
    

规则总结

  1. 方法名必须准确premain / agentmain
  2. 方法签名必须正确public static void
  3. MANIFEST.MF 必须配置Premain-Class / Agent-Class
  4. 权限必须声明Can-Redefine-Classes
  5. 打包必须包含清单:JAR 包中要有正确的 MANIFEST.MF

简单说:JVM 通过 方法名 + MANIFEST.MF 配置 来识别和调用 Agent,两者缺一不可!

标准目录结构

my-agent-project/
├── src/
│   └── com/example/
│       └── HotFixAgent.java
├── META-INF/
│   └── MANIFEST.MF
└── pom.xml (如果使用 Maven)

Agent实现热更

agentmain方法和premain方法执行时机:

  • agentmain方法:

    # 启动时使用 -javaagent 参数
    java -javaagent:agent.jar=args -jar app.jar# 时间线演示
    JVM 启动↓
    检测到 -javaagent 参数↓
    加载 agent.jar↓
    查找 MANIFEST.MF 中的 Premain-Class↓
    调用 premain("args", instrumentation)  // ← 在这里执行!↓
    继续 JVM 启动流程↓
    调用应用的 main() 方法↓
    应用开始运行
    
  • premain方法:

    # 应用已在运行,通过 Attach API 动态加载
    java -jar app.jar                    # 先启动应用,无论有没有【-javaagent 参数】都行↓ (应用运行中...)
    java -jar agent-loader.jar <pid> agent.jar args  # 动态附加# 时间线演示
    应用正常运行中...↓ (运行了 5分钟、5小时、5天...)
    用户执行 Attach 命令↓
    VirtualMachine.attach(pid)↓
    vm.loadAgent("agent.jar", "args")↓
    目标 JVM 中调用 agentmain("args", instrumentation)  // ← 在这里执行!↓
    应用继续运行,无中断
    

Premain预防性的,在问题发生前准备好工具
Agentmain治疗性的,在问题发生时紧急处理

方面 Premain Agentmain
触发时机 JVM 启动时 JVM 运行时
执行顺序 在 main() 之前 在应用运行中
加载方式 静态加载 动态附加

agent相当于一个工具,要实现热更,有2种策略。

  1. agentmain方法,针对没有配置-javaagent:的进程,可以直接java -jar agent-loader.jar mu-agent-1.0.0.jar后,就能热更,无需启动

  2. premain方法+启动的时候配置-javaagent:的进程,可以直接热更

Agent 使用示例

Agent 类示例

package com.example;public class HotFixAgent {private static Instrumentation INST;// premain - 静态加载入口public static void premain(String agentArgs, Instrumentation inst) {INST = inst;System.out.println("Agent 静态加载: " + agentArgs);}// agentmain - 动态加载入口  public static void agentmain(String agentArgs, Instrumentation inst) {INST = inst;System.out.println("Agent 动态加载: " + agentArgs);}// 业务方法public static void doHotFix(String className, byte[] bytes) {// 热修复逻辑}
}

Maven 配置

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifestEntries><Premain-Class>com.example.HotFixAgent</Premain-Class><Agent-Class>com.example.HotFixAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes><Can-Attach>true</Can-Attach></manifestEntries></archive></configuration>
</plugin>

打包后测试

检查 JAR 包配置
# 验证 MANIFEST.MF 是否正确
jar tf my-agent.jar | grep META-INF/MANIFEST.MF
jar xf my-agent.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF
测试 premain
# 测试静态加载
java -javaagent:my-agent.jar=test -version
# 应该看到: "Agent 静态加载: test"
测试 agentmain
// 测试动态加载
public class TestAttach {public static void main(String[] args) throws Exception {String pid = args[0];VirtualMachine vm = VirtualMachine.attach(pid);vm.loadAgent("my-agent.jar", "dynamic-test");vm.detach();}
}
http://www.jsqmd.com/news/39342/

相关文章:

  • 利用Java反射绕过Minecraft模组限制的技术解析
  • 足球
  • 新建 Microsoft Word 文档
  • 2025 年 11 月污水提升泵厂家推荐排行榜,进口污水提升泵,地下室家用污水提升泵,别墅/厕所/卫生间马桶污水提升泵,厨房墙排一体化污水提升泵公司推荐
  • 2025年高大空间冷暖机组厂家权威推荐榜单:高大空间供暖设备/高大空间采暖器/高大空间热水暖风机源头厂家精选
  • vue2 项目打包优化 - 东方不败-
  • 2025下半年国内液压/电动/半自动升降柱厂家排行榜:技术领先企业全面解析
  • Tita 项目:赋能教育培训机构突围,开启高效运营新篇章
  • 2025年矿用设备设施安全检测检验企业口碑排行榜
  • 2025年11月国内矿用设备设施安全检测检验厂家top10
  • 2025年矿用设备设施安全检测检验企业推荐指南
  • centos6.5升级openssh10.2p1
  • adb gdb+gdbserver远程调试ddsrouter
  • A4纸打印标签
  • 十、修改数据表 alter
  • TIA Portal 最新正式版本是 V20
  • Python 集合Set简介
  • 安装WIndows11时绕过微软账户强制要求,使用本地账户登录
  • 2025年RS485噪声监测仪定做厂家权威推荐榜单:噪声检测仪/工业声音传感器/噪声检测传感器源头厂家精选
  • 配置Centos/Ubuntu免密登录
  • HarmonyOS Next 快速参考手册 - 实践
  • 国标GB28181算法算力平台EasyGBS:构筑公安数字化安防的“核心枢纽”
  • 2025年11月重庆眼镜店最新推荐,覆盖青少年配眼镜/儿童配眼镜/老年人配眼镜/全人群配镜需求
  • 4、管理用户
  • 2、聚合查询(聚合函数)
  • 字节新动作!豆包编程模型 Doubao-Seed-Code 正式亮相,AI 写项目时代来了
  • 吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(六)课后习题和代码实践
  • 2025年北京物业合作公司权威推荐榜单:医院物业加盟/学校物业加盟/物业加盟合作伙伴精选
  • 2025年重庆配眼镜标杆商家最新推荐:雷曼森眼镜,青少年配眼镜|儿童配眼镜|老年人配眼镜|个性化验配新标准
  • 测试岗位所需的工作能力