Java探针技术-动态agent机制:在main函数启动之后运行agent
2023-02-18 16:23:37 时间
premain是Java SE5开始就提供的代理方式,由于其必须在命令行指定代理jar,并且代理类必须在main方法前启动。因此,要求开发者在应用前就必须确认代理的处理逻辑和参数内容等等。在有些场合下,premain代理方式不能满足需求。为解决运行时启动代理类的问题,Java SE6开始提供了在应用程序的VM启动后在动态添加代理的方式,即agentmain方式。
- 在manifest中指定Agent-Class属性,值为代理类全路径
- 代理类需要提供 public static void agentmain(String args, Instrumentation inst) 或 public static void agentmain(String args)方法。并且再二者同时存在时以前者优先。args和inst和premain中的一致。
package aty.agent.after; import java.lang.instrument.Instrumentation; public class AgentAfterMain{ public static void agentmain(String args, Instrumentation inst){ System.out.println("loadagent after main run.args=" + args); Class<?>[] classes = inst.getAllLoadedClasses(); for (Class<?> cls : classes){ System.out.println(cls.getName()); } System.out.println("agent run completely."); } }
将该代理类打成jar包,并修改MANIFEST.MF文件
Manifest-Version: 1.0 Agent-Class: aty.agent.after.AgentAfterMain
编写好agent jar之后,接下来需要将该jar挂接到目标进程的jvm中执行。由于agent main方式无法向pre main方式那样在命令行指定代理jar,因此需要借助Attach Tools API。使用com.sun.tools.attach包下的VirtualMachine类,使用attach pid 来得到相应的VirtumalMachine,使用loadAgent 方法指定AgentMain所在类并加载。其中com.sun.tools.attach.VirtualMachine的jar包是jdk下lib中的tools.jar
package aty.agent.after; import com.sun.tools.attach.VirtualMachine; public class RunAttach{ public static void main(String[] args) throws Exception{ // args[0]传入的是某个jvm进程的pid String targetPid = args[0]; VirtualMachine vm = VirtualMachine.attach(targetPid); vm.loadAgent("F:/workspaces/j2se练习代码/jvm_high_api/agentmain.jar","toagent"); } }
相关文章
- Java对象拷贝原理剖析及最佳实践
- JavaFx出现错误Caused by: java.lang.NullPointerException: Location is required的解决方法
- Java 学习笔记 Junit4单元测试使用
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
- Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
- Java 学习笔记 使用synchronized实现生产者消费者模式
- Java 学习笔记 观察者模式与适配者模式 监控文件夹
- Java 学习笔记 线程控制
- java学习笔记 线程的实现与同步
- Java 学习笔记 泛型
- Java 学习笔记 反射与迭代器
- Java 学习笔记 正则表达式
- Java 学习笔记 执行外部命令 包装类 枚举类型
- Java 学习笔记 判断一个数组是否有序
- Java 学习笔记 IO流与File操作
- Java小工具 根据文本批量修改文件名
- Java学习笔记 抽象类 接口 多态
- Java Scanner nextLine方法跳过
- Java 学习笔记 两大集合框架Map和Collection
- Java学习笔记——i++与++i问题