当前位置: 首页 > 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.jsqmd.com/news/971385/

相关文章:

  • 2026 济南防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南 - 宅安选房屋修缮
  • 德国酷贝漆靠谱吗? - myqiye
  • 水泵隔音降噪技术全解析:新能源噪音治理、新能源隔音降噪、机房噪音治理、水泵房噪音治理、车间噪音治理、车间隔音降噪选择指南 - 优质品牌商家
  • 手机号查QQ终极指南:3个技巧帮你找回遗忘的账号
  • 动平衡机靠谱品牌,中联试验机的口碑怎样 - mypinpai
  • 如何快速掌握ExifToolGui:照片元数据管理的完整指南
  • 2026年托管加盟品牌实测推荐:托管加盟多少钱、托管加盟小饭桌、托管加盟手续、托管加盟推荐、教育加盟哪家好、教育加盟多少钱选择指南 - 优质品牌商家
  • 2026年修补砂浆厂家推荐榜单:快速修补、高强度修补与地面修复砂浆精选指南 - 品牌发掘
  • 关于下载pip install faiss-cpu失败的问题
  • 手绘字画和印刷字画怎么分?一招不再买错 - 深鉴新闻
  • 5个突破性功能:重新定义英雄联盟游戏体验的一站式解决方案
  • 企业品牌声誉管理靠谱之选(2026年6月):AI舆情监测/危机处置/声誉修复三大技术流派全攻略 - 玖叁鹿
  • 2026 东莞防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 终极指南:免费快速下载B站4K高清视频的完整教程
  • 2026年薄型气凝胶价格,哪家更实惠 - mypinpai
  • .net 简单的数据库操作框架
  • 《jQuery 过滤》
  • 2026年6月最新苏州管道疏通/马桶下水道疏通公司评价高的Top5:优选110公安备案+CCTV内窥镜 - 极速版本
  • 2026 宁波防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 索引:图书馆的索书牌,数据库查询加速神器
  • 全自动L型封切热收缩切角包膜机技术选型与厂家解析:开箱机厂家/收缩膜包装机厂家/热收缩机厂家/热收缩膜包装设备厂家/选择指南 - 优质品牌商家
  • 终极免费抖音批量下载工具:3步完成无水印视频一键保存
  • 2026年 玻璃钢防腐/三布五油/重防腐施工厂家推荐:专业防腐蚀工程结合陶瓷颗粒防滑路面、泡菜池及无震动止滑坡道公司精选! - 品牌发掘
  • 域名真实性校验架构:非法平台钓鱼攻击防御研究
  • 为什么Flameshot成为开发者最爱的开源截图工具?探索其技术架构与高效工作流
  • 语音钓鱼引发的数据泄露事件溯源与全域防御研究
  • DLOS AI OS MVP 1.0:面向大语言模型的操作系统级验证与执行架构
  • 2026净水设备厂家选型指南:重力式无阀滤池、一体化净水器、一体化地埋式污水处理设备装置、全自动净水器厂家、全自动净水器推荐选择指南 - 优质品牌商家
  • AI Agent Harness Engineering 融资策略:创业公司如何获得资本青睐
  • 2026年 HC820/1180DPD+Z 高强钢厂家推荐榜单:汽车用先进高强钢/镀层板/冲压专用材源头工厂深度解析 - 品牌发掘