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

Java Agent Premain Agentmain

概念

Java Agent 是一种特殊的 Java 程序,通过 Instrumentation API 在 JVM 启动时(premain)或运行时(agentmain)动态修改或增强字节码。常用于性能监控、代码热修复、AOP 等场景。

premain是在jvm启动的时候类加载到虚拟机之前执行的,需在 MANIFEST.MF 中声明Premain-Class

agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。 这种方式会转换会有一些限制,比如不能增加或移除字段。需在 MANIFEST.MF 中声明Agent-Class,并通过VirtualMachineAPI 附加到目标 JVM。

具体的做法,两者的实际做法是差不多的:

premain

定义个静态方法public static void premain(String args, Instrumentation inst),

在java 的启动参数中添加 -javaagent:/jar包路径[=agentArgs] 这样定义了后jvm启动时,就会去加载javaagent中指定的jar包,查找MANIFEST.MF文件中Premain-Class属性的类,执行premain方法。

Manifest-Version: 1.0 Can-Redefine-Classes: true Premain-Class: com.premian.MyAgent Can-Retransform-Classes: true
import java.lang.instrument.Instrumentation; import java.lang.management.ManagementFactory; @Slf4j public class PreMain { public static void premain(String agentArgs, Instrumentation inst) { log.debug("--> during jvm pre main run... <--"); // agentLogic(agentArgs, inst); String jvmPid = jvmPid(); try { FileUtil.writeToFile(System.getProperty("user.dir") + "/pid", jvmPid); } catch (IOException e) { e.printStackTrace(); log.error("[ERROR] write pid to file error."); } log.debug("--> premain get class end <--\n"); } private static String jvmPid() { String thisJvmName = ManagementFactory.getRuntimeMXBean().getName(); String thisJvmPid = thisJvmName.split("@")[0]; log.debug("--> this jvm process pid: " + thisJvmPid + "\n"); return thisJvmPid; } }

agentmain

定义个静态方法public static void agentmain(String agentOps, Instrumentation instrumentation),

在生成jar包中MANIFEST.MF文件中需要有Agent-Class: xxx.xxx (xxx.xxx就是上面agentmain方法所在的类名)
Can-Retransform-Classes: true

Manifest-Version: 1.0 Can-Redefine-Classes: true Agent-Class: cn.think.in.java.clazz.loader.asm.agent.AgentMainTraceAgent Can-Retransform-Classes: true
使用下面代码,将agent添加到指定java进程 public class AgentMain { public static void agentmain(String agentArgs, Instrumentation inst) { vm = VirtualMachine.attach(pid); try { vm.loadAgent("D:\\tmp\\my-java-agent-1.0-jar-with-dependencies.jar", null); } finally { vm.detach(); } }

注意事项

  1. JVM 参数
    • 启动时加载:-javaagent:/path/to/agent.jar=args
    • 运行时加载:依赖tools.jar(JDK 路径下)。
  2. 安全限制
    • 某些 JVM 实现可能限制运行时附加。
    • 需开启Can-Redefine-ClassesCan-Retransform-Classes
  3. 性能影响
    频繁的字节码操作可能导致性能开销。

常见工具与框架

  • Byte Buddy:简化字节码操作。
  • Javassist:动态生成和修改类。
  • Arthas:基于 Agent 的运行时诊断工具。
http://www.zskr.cn/news/1483112.html

相关文章:

  • 手机号查QQ终极指南:3个技巧帮你找回遗忘的账号
  • 2026 东莞防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 2026年托管加盟品牌实测推荐:托管加盟多少钱、托管加盟小饭桌、托管加盟手续、托管加盟推荐、教育加盟哪家好、教育加盟多少钱选择指南 - 优质品牌商家
  • 终极指南:免费快速下载B站4K高清视频的完整教程
  • 2026年修补砂浆厂家推荐榜单:快速修补、高强度修补与地面修复砂浆精选指南 - 品牌发掘
  • .net 简单的数据库操作框架
  • 2026年 玻璃钢防腐/三布五油/重防腐施工厂家推荐:专业防腐蚀工程结合陶瓷颗粒防滑路面、泡菜池及无震动止滑坡道公司精选! - 品牌发掘
  • 2026 宁波防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 《jQuery 过滤》
  • 图像矢量化神器:3分钟让PNG/JPG变身清晰SVG的终极指南
  • 2026净水设备厂家选型指南:重力式无阀滤池、一体化净水器、一体化地埋式污水处理设备装置、全自动净水器厂家、全自动净水器推荐选择指南 - 优质品牌商家
  • AI Agent Harness Engineering 融资策略:创业公司如何获得资本青睐
  • 2026年 修补乳液/丙烯酸乳液厂家推荐榜单:高粘附力、强耐候性的优质品牌与技术先锋深度解析 - 品牌发掘
  • 怎样安全解锁中兴光猫设备:专业网络设备管理工具完全指南
  • 网红弧形GRG背景墙技术解析与行业选型参考:GRG艺术造型构件/中庭穹顶GRG定制/别墅轻奢GRG造型/办公室大堂GRG墙面造型/选择指南 - 优质品牌商家
  • 双金属耐磨管技术解析与江苏昱杨制造实力深度拆解:江苏昱杨机械联系、双金属灰水耐磨管、双金属耐磨直管、电厂输粉双金属耐磨管选择指南 - 优质品牌商家
  • 3分钟搞定全国高铁数据!这个开源工具让你轻松掌握列车时刻表 [特殊字符]
  • 2026 合肥防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 2026年 环氧地坪漆厂家推荐榜:环氧树脂地坪漆/无溶剂环氧地坪漆/水性环氧地坪漆最新精选品牌 - 品牌发掘
  • 嵌入式小白第三站:UART、I2C、SPI、ADC 怎么学?从传感器读数到完整小项目
  • 数字频率计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026 西安防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 2026年6月市面上广州酒回收门店怎么选择推荐榜,老酒/名酒/洋酒回收机构选择指南 - 海棠依旧大
  • VidDown 使用介绍:一个免费、本地化的在线工具集
  • 2026年智能数据治理平台排行:大模型数智化赋能/工厂设备数智巡检/政务社区数智助手/数据治理安全审计/数智物流保险平台/选择指南 - 优质品牌商家
  • 2026年6月口碑好的苏州板式办公桌厂家选择推荐榜:板式办公桌、实木办公桌、钢制办公桌品牌选择指南 - 海棠依旧大
  • 3分钟解锁中兴光猫隐藏功能:zteOnu工具终极指南
  • 比利时银行业网络钓鱼欺诈赔偿规则与综合防御研究
  • YouTube推荐系统技术拆解:多目标优化与实时反馈闭环
  • 能让不同架构的gpu一起训练 跨芯片统一、异构混合训练、自动并行调优