快速业务通道

Java运行时监控,第2部分: 编译后插装和性能监控 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
字节码被直接插入到一个 Java 类中,从而获得类最初不支持的功能。对于希望修改类而不触及源代码,或者希望在运行时动态修改类定义的开发人员,这个过程可以实现多种用途。我将向您展示如何使用 BCI 来将性能监控插装注入到类中。

不同的 BCI 框架可以以不同的方式达到这个目的。有一个简单的可以在方法级实现插装的技巧:重新命名目标方法,并使用包含跟踪指令并调用初始(重命名的)方法的原始签名插入一个新方法。一个名为 JRat 的开源 BCI 工具演示了一个技巧,该技巧专门为方法执行收集运行时间,因此要比通用的 BCI AOP 工具(参见 参考资料)简短。我将一个 JRat 项目的例子压缩成了清单 15 所示的内容:

清单 15. 使用 BCI 的插装方法示例

////////////////////////////////////////////////////////////// // The Original Method ////////////////////////////////////////////////////////////// public class MyClass { public Object doSomething() {     // do something   } } ////////////////////////////////////////////////////////////// // The New and Old Method ////////////////////////////////////////////////////////////// public class MyClass {   private static final MethodHandler handler = HandlerFactory.getHandler(...);   // The instrumented method   public Object doSomething() {     handler.onMethodStart(this);     long startTime = Clock.getTime();     try {       Object result = real_renamed_doSomething(); // call your method       handler.onMethodFinish(this, Clock.getTime() - startTime, null);     } catch(Throwable e) {       handler.onMethodFinish(this, Clock.getTime() - startTime, e);       throw e;     }   }   // The renamed original method   public Object real_renamed_doSomething() {     // do something   } }

Java运行时监控,第2部分: 编译后插装和性能监控(17)

时间:2011-02-13 IBM Nicholas Whitehead

实现 BCI 的两个常用策略为:

静态:Java 类或者类库被插装,插装的类被保存在原始类或类库的副本中。然后这些副本被部署到一个应用程序,这个应用程序对插装的类和其他的类一视同仁。

动态:在类载入过程中,Java 类在运行时被插装。插装的类仅暂存于内存中;JVM 结束后,它们就会消失。

动态 BCI 的优势之一就在于提供了灵活性。动态 BCI 通常都是依照一组被配置的指令(通常位于一个文件中)执行。虽然它支持热交换,但修改插装只需要升级该文件和 JVM 周期就可以了。尽管动态 BCI 很简单,但我还是要先分析静态插装过程。

静态 BCI

在这个例子中,我将使用静态 BCI 来插装 EmpDAOImpl 类。我将使用 JBoss AOP,一个开源 BCI 框架(参见 参考资料)。

第一步:定义我要用来收集方法调用性能数据的截取程序,因为这个类将会被静态编入 EmpDAOImpl 类的字节码中。在这种情况下,JBoss 接口与我为 Spring 定义的截取程序是相同的,不同的是导入的类名。这个例子使用的截取程序是 org.runtimemonitoring.aop.ITracerInterceptor。第二步:使用与定义 EJB 3 截取程序的 jboss-aop.xml 相同的语法定义 jboss-aop.xml 文件。清单 16 显示了该文件:

清单 16. 静态 BCI jboss-aop.xml 文件

<aop>   <interceptor class="org.runtimemonitoring.aop.ITracerInterceptor" scope="PER_VM"/>   <bind   pointcut="execution(public * $instanceof{org.runtimemonitoring.spring.DAO}->get(..))

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号