读书人

构建自各儿的监测器【3】-instrumenta

发布时间: 2013-10-08 15:10:51 作者: rapoo

构建自己的监测器【3】-instrumentation

其实前一节已经看到过instrumentation了,就是在premain方法的参数里:

java instrument相关的类主要在Package java.lang.instrument下面,看它package的描述:

Provides services that allow Java programming language agents to instrument programs running on the JVM. The mechanism for instrumentation is modification of the byte-codes of methods.

关于java instrument

“java.lang.instrument”包的具体实现,依赖于 JVMTI。JVMTI(Java Virtual Machine Tool Interface)是一套由 Java 虚拟机提供的,为 JVM 相关的工具提供的本地编程接口集合。JVMTI 是从 Java SE 5 开始引入,整合和取代了以前使用的 Java Virtual Machine Profiler Interface (JVMPI) 和 the Java Virtual Machine Debug Interface (JVMDI),而在 Java SE 6 中,JVMPI 和 JVMDI 已经消失了。JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能。事实上,java.lang.instrument 包的实现,也就是基于这种机制的:在 Instrumentation 的实现当中,存在一个 JVMTI 的代理程序,通过调用 JVMTI 当中 Java 类相关的函数来完成 Java 类的动态操作。除开 Instrumentation 功能外,JVMTI 还在虚拟机内存管理,线程控制,方法和变量操作等等方面提供了大量有价值的函数。

我认为Instrumentation 的最大作用,就是类定义动态改变和操作。在 Java SE 5 及其后续版本当中,开发者可以在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 javaagent 参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序(这和上面讲到agent时是一致的,只是当时没有利用Instrumentation功能)。

现在写个简单的例子来说明java instrument的功能,这个例子很简单,就是计算某些方法的耗时,在最原始的方法中我们是这样做的,如下代码:

运行,可以输出结果已经有点意思了:

构建自各儿的监测器【3】-instrumentation

so,我们既没有手工的去修改MyTest类的每个方法,也不需要重新打包部署应用代码。只要在启动应用时加上-javaagent参数,利用java instrumentation来修改class字节码,从而达到AOP的效果。

以后要是在多加一个monitor.agent.MyTest.sayHello3需要监测耗时,也不需要修改应用代码,只要在MonitorTransformer的methodList中多加一个方法就可以了:

    static{        methodList.add("monitor.agent.MyTest.sayHello");        methodList.add("monitor.agent.MyTest.sayHello2");      methodList.add("monitor.agent.MyTest.sayHello3");    }

如果想搞的更智能一些,methodList可以搞成配置文件配置的,而不用写死在代码中。

下一次就写一下怎么利用java的-D参数用配置文件来配置methodList........

读书人网 >编程

热点推荐