JVM的动态agent机制:在main函数启动之后运行agent
2014-09-02 22:31
399 查看
premain是Java SE5开始就提供的代理方式,由于其必须在命令行指定代理jar,并且代理类必须在main方法前启动。因此,要求开发者在应用前就必须确认代理的处理逻辑和参数内容等等。在有些场合下,premain代理方式不能满足需求。为解决运行时启动代理类的问题,Java SE6开始提供了在应用程序的VM启动后在动态添加代理的方式,即agentmain方式。
与Permain类似,agent方式同样需要提供一个agent jar,并且这个jar需要满足:
1、在manifest中指定Agent-Class属性,值为代理类全路径
2、代理类需要提供public static void agentmain(String args, Instrumentation inst)或public static void agentmain(String args)方法。并且再二者同时存在时以前者优先。args和inst和premain中的一致。
编写好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
与Permain类似,agent方式同样需要提供一个agent jar,并且这个jar需要满足:
1、在manifest中指定Agent-Class属性,值为代理类全路径
2、代理类需要提供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"); } }
相关文章推荐
- 从jvm运行机制来分析String对象
- Java的JVM运行的原理机制详解
- JVM无法启动,jps无法运行,提示内存不足
- JVM 基础 VM运行机制
- Java学习第一篇 Java程序运行机制和jvm
- 疯狂JAVA之学习笔记(1)-------------Java运行机制及JVM
- 从jvm运行机制来分析String对象
- OC消息机制和动态运行时
- MFC窗口程序启动运行机制剖析
- objective-c运行时机制runtime,动态获取对象的属性和成员变量
- JVM 本地连接失败时,检查运行程序JVM启动参数
- 今天更新代码之后,突然出现一个问题:Tomcat启动时,总是会出现jvm fatal error错误导致tomcat无法正常启动,以下是错误信息:
- Java程序的运行机制和JVM
- runtime浅谈(一)动态运行时和消息机制
- Tracker 是一个运行于浏览器书签栏的 JavaScript 嗅探工具,她将被启动于其他网页之后,为了协助您了解目标网页中 JavaScript 的运行情况
- tomcat启动之后没有报错,但执行main函数时会出现异常
- JVM虚拟机启动和运行的参数配置
- Android Activity运行机制之不同场景下的启动顺序
- 利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(一)
- 深入解析java虚拟机-jvm运行机制