`
helpbs
  • 浏览: 1163727 次
文章分类
社区版块
存档分类
最新评论

java instrument 初探

 
阅读更多

java在1.5引入java.lang.instrument,你可以由此实现一个java agent,通过此agent来修改类的字节码即改变一个类。本文中,会通过java instrument 实现一个简单的profiler。当然instrument并不限于profiler,instrument可以做很多事情,

它类似一种更低级,更松耦合的AOP,可以从底层来改变一个类的行为,你可以由此产生无限的遐想。

接下来要做的事情,就是计算一个方法所花的时间,通常我们会在代码这么写:
在方法开始开头加入long stime = System.nanoTime();
在方法结尾通过System.nanoTime()-stime得出方法所花时间,你不得不在你想监控的每个方法中写入重复的代码,
好一点的情况,你可以用AOP来干这事,但总是感觉有点别扭,这种profiler的代码还是打包在你的项目中,

java instrument使得这更干净。

1) 写agent类

2)写ClassFileTransformer类


上面两个类就是agent的核心了,jvm启动时并会在应用加载前会调用 PerfMonAgent.premain, 然后PerfMonAgent.premain中实例化了一个定制的ClassFileTransforme即 PerfMonXformer
并通过inst.addTransformer(trans);把PerfMonXformer的实例加入Instrumentation实例(由jvm传入),这就使得应用中的类加载的时候, PerfMonXformer.transform都会被调用,你在此方法中
可以改变加载的类,真的有点神奇,为了改变类的字节码,我使用了jboss的javassist,虽然你不一定要这么用,但jboss的javassist真的很强大,让你很容易的改变类的字节码。在上面的方法中
我通过改变类的字节码,在每个类的方法入口中加入了long stime = System.nanoTime();,在方法的出口加入了System.out.println("methodClassName.methodName:"+(System.nanoTime()-stime));

3) 打包agent
对于agent的打包,有点讲究,
3.1)
jar的META-INF/MANIFEST.MF加入Premain-Class: xx, xx在此语境中就是我们的agent类,即org.toy.PerfMonAgent
3.2)
如果你的agent类引入别的包,需使用Boot-Class-Path: xx,xx在此语境中就是上面提到的jboss javassit 即 /home/pwlazy/.m2/repository/javassist/javassist/3.8.0 .GA/javassist-3.8.0.GA.jar

下面附上maven 的pom


最终打成一个包toy-inst-1.0-SNAPSHOT.jar


4)打包应用
随便写个应用



最终打成一个包toy-1.0-SNAPSHOT.jar

5)执行命令



java选项中有-javaagent:xx,xx就是你的agent jar,java通过此选项加载agent,由agent来监控classpath下的应用。

最后的执行结果:

我们由执行结果可以看出执行顺序以及通过改变org.toy.App的字节码加入监控代码确实生效了。

你也可以发现通过instrment实现agent是的监控代码和应用代码完全隔离了。

分享到:
评论

相关推荐

    JAVA API官方中文版手册chm文件文档

    JAVA API官方文档中文版软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font ...java.lang.instrument java.lang.management java.lang.ref

    national instrument labview modbus

    national instrument labview modbus

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    Java Instrumentation笔记

    Java SE 6新特性:Instrumentation,利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决...

    Java 1.6 API 中文 New

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    MATLAB Instrument Control Toolbox

    MATLAB Instrument Control Toolbox

    JavaAPI1.6中文chm文档 part1

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    java api最新7.0

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了...

    Java.lang.Instrument 代理Agent使用

    java.lang.Instrument包是在 JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码 。这通常是在 类的main方法调用之前 进行预处理的操作,通过java指定该类的代理类来实现。在 类的字节码载入JVM前 会调用...

    java 实验 继承与多态 免费下载

    (1)请编程实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)、大提琴(Cello),三种乐器的弹奏play()方法各不相同。编写一个测试类InstrumentTest,要求编写方法testPlay(Instrument in),对这三种...

    Multi-Instrument Pro 3.9.3万用仪

    Multi-Instrument Pro 3.9.3最新版万用仪,Multi-Instrument万用仪将你的电脑变为一台多功能的虚拟仪器,如示波器,频谱分析仪、声谱仪,频率计声压计,振动计及LCR表,设备检测仪数据记录仪,信号发生器等仪器。

    GMS Aircraft Instrument Helps

    GMS Aircraft Instrument ActiveX Control User's Help

    virtual instrument 外文翻译

    virtual instrument 外文文献翻译加原文

    jdk 5 instrument学习

    instrument接口的学习,可使jvm装入类文件之前对字节码进行修改。

    spring-instrument源码

    spring-instrument源码可以直接导入Eclipse工程里面!

    Multi Instrument Manual

    Multi Instrument中文手册

    Java语言程序设计实验之类与对象

    Java语言程序设计实验之类与对象 1:乐器(Instrument)分为:钢琴(Piano),小提琴(Violin),各种乐器的弹奏(play)方法各不相同。 2:编写一个测试类InstrumentTest,要求:编写方法 testPlay,对各种乐器进行...

    agent booktrading

    基于agent的图书交易系统,基于agent语义协商的图书交易系统

    JAVA_SE_6_新特征.rar

    利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者...

    financial instrument pricing using C++

    financial instrument pricing using C++ financial instrument pricing using C++

Global site tag (gtag.js) - Google Analytics