Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent

导读:本篇文章讲解 Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

  premain是Java SE5开始就提供的代理方式,由于其必须在命令行指定代理jar,并且代理类必须在main方法前启动。因此,要求开发者在应用前就必须确认代理的处理逻辑和参数内容等等。在有些场合下,premain代理方式不能满足需求。为解决运行时启动代理类的问题,Java SE6开始提供了在应用程序的VM启动后在动态添加代理的方式,即agentmain方式。 

与premain类似,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");
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/70282.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!