Instrumentation

Instrumentation的功能

Java Instrumentation指的是用代理程序来监测和协助运行在JVM上的应用程序,并且这种代理程序是独立于应用程序之外的,这是Instrumentation功能的最主要特性。
Instrumentation能够监测和协助的功能主要包括:

  • 获取JVM运行时状态
  • 在运行时动态修改类定义

在 Java SE 5+中,可以在一个普通 Java 类(具有main 函数,对于Tomcat内的应用,Tomcat自身带有main函数)运行时,通过 -javaagent 参数指定一个特定的 jar 文件来启动 Instrumentation 的代理程序。启动代理程序有以下两种方式。

premain方式

main方法启动前启动一个代理程序.语法:java -javaagent:agent_jar_path[=options] java_app_name
为了实现代理功能,需要:

  • 代理类必须提供一个public static void premain(String args, Instrumentation inst)或 public static void premain(String args) 方法
    举个栗子:
public class Main {
    public static void premain(String args, Instrumentation inst) {
        Manager.instance().initialization();
        inst.addTransformer(new ProfTransformer());//这里的ProfTransformer主要用于修改字节码
        Manager.instance().startupThread();
    }
}
  • jar包的manifest文件中包含Premain-Class属性,并且属性的值为代理类全路径名
    举个栗子:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: manlge
Build-Jdk: 1.7.0_25
Premain-Class: com.taobao.profile.Main

agentmain方式

agentmain方式能够在JVM启动后动态的去修改一些类的行为,这一点可以极大地提高调试效率。 实现步骤:

  • 代理类需要提供public static void agentmain(String args, Instrumentation inst)或public static void agentmain(String args)方法。如果这两个方法同时存在,以前者优先。
  • 在manifest中指定Agent-Class属性,值为代理类全路径
  • Attach API,在运行时动态加载一个代理jar,详细方式可以参考这里
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值