当前位置: 首页 > 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.gsyq.cn/news/48486.html

相关文章:

  • 利用Java反射绕过Minecraft模组限制的技术解析
  • Apache RocketMQ在Windows下的保姆级安装教程(含可视化界面安装) - 教程
  • 2025下半年国内液压/电动/半自动升降柱厂家排行榜:技术领先企业全面解析
  • 2025年11月国内矿用设备设施安全检测检验厂家top10
  • centos6.5升级openssh10.2p1
  • 配置Centos/Ubuntu免密登录
  • HarmonyOS Next 快速参考手册 - 实践
  • 国标GB28181算法算力平台EasyGBS:构筑公安数字化安防的“核心枢纽”
  • 2、聚合查询(聚合函数)
  • 一、MySQL 认识
  • 2025年重庆配眼镜标杆商家最新推荐:雷曼森眼镜,青少年配眼镜|儿童配眼镜|老年人配眼镜|个性化验配新标准
  • 2025年国内工业制冷品牌十大厂家权威推荐排行榜
  • Day20标准流
  • 2025年阜阳民事纠纷律师排行榜前十强权威推荐
  • 2025年广场砖专用瓷砖批发厂家权威推荐榜单:花纹广场砖/彩色广场砖/楼顶砖源头厂家精选
  • 严格次小生成树板子
  • Python 字典Dictionary简介
  • 2025年船舶下水气囊生产厂家权威推荐榜单:平台底部支持气囊/高压橡胶气囊/沉箱移运气囊源头厂家精选
  • 实用指南:toLua[六] Examples 05_LuaCoroutine分析
  • 2025年石岛红光板源头厂家综合评测:石岛红石材/中国黑石材/五莲灰石材源头厂家精选
  • 2FSK 调制指数 、相关系数 、 频谱特性
  • 2025年山东艺考生文化课培训机构推荐:济南山师育才学校,艺考生文化课/全日制艺考生文化课/专注山东全日制教学
  • 2025年石家庄GEO推广公司权威推荐榜单:GEO排名优化/GEO营销/GEO招商源头公司精选
  • [电调]AM32电调调参系列 —— Motor KV参数分析
  • 剪映高级感口播字幕预设220M850款轻量合集,拖拽生成商业级动态文字(Win_Mac通用)
  • 手动清除Ubuntu系统中的内存缓存的步骤
  • VMware ESXi 8.0U3g 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版
  • VMware ESXi 9.0.1.0 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版
  • 基于微信小应用的垃圾分类管理系统【2026最新】
  • 完整教程:人体心率测量技术