news 2026/6/8 0:32:35

Java Agent Premain Agentmain

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 的运行时诊断工具。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 0:22:59

语音钓鱼引发的数据泄露事件溯源与全域防御研究

摘要 语音钓鱼作为传统网络钓鱼的延伸形态&#xff0c;正逐步成为企业数据泄露的重要诱因。本文以 Aura 公司遭遇语音钓鱼攻击并引发大规模客户数据泄露事件为核心研究样本&#xff0c;梳理该安全事件的攻击过程、泄露数据规模、威胁组织行为以及事件衍生影响。本次事件由针对企…

作者头像 李华
网站建设 2026/6/8 0:20:50

3分钟快速上手:Ofd2Pdf免费开源工具完整使用指南

3分钟快速上手&#xff1a;Ofd2Pdf免费开源工具完整使用指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否经常需要将OFD格式的电子公文、合同文档转换为更通用的PDF格式&#xff1f;Ofd2Pdf…

作者头像 李华
网站建设 2026/6/8 0:19:33

为什么选择Bazzite:为游戏玩家打造的一站式Linux操作系统

为什么选择Bazzite&#xff1a;为游戏玩家打造的一站式Linux操作系统 【免费下载链接】bazzite Bazzite makes gaming and everyday use smoother and simpler across desktop PCs, handhelds, tablets, and home theater PCs. 项目地址: https://gitcode.com/gh_mirrors/ba/…

作者头像 李华
网站建设 2026/6/8 0:10:57

万亿级数据迁移实战与生产事故复盘

万亿级数据迁移实战与生产事故复盘一、数据迁移的复杂性&#xff1a;从 GB 到 PB 的量级跨越 数据迁移是存储工程师职业生涯中必然会遇到的挑战&#xff0c;它看似是一个纯粹的技术问题&#xff0c;实际上却融合了架构设计、项目管理、风险控制、应急响应等多维度的能力要求。当…

作者头像 李华
网站建设 2026/6/7 23:57:03

机器人仿真终极指南:使用Gazebo Sim快速构建真实机器人系统

机器人仿真终极指南&#xff1a;使用Gazebo Sim快速构建真实机器人系统 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim 是一款功能强大的开源机器人仿真平台&…

作者头像 李华