快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
ublic static void premain(String args, Instrumentation inst) 方法。正如名称 premain 所暗示的,这个方法是在主 Java 应用程序入口点前被调用的,该入口点允许调用的类优先访问它,从而开始修改载入的类。关于这点它是通过注册 ClassTransformer(第二个结构)实例来实现的。ClassTransformer 接口负责从类加载程序有效截取调用并动态重写载入类的字节码。ClassTransformer 的单个方法 — transform — 被传入要重定义的类和包含类的字节码的字节数组。然后 transform 方法实现各种修改,并返回一个包含修改的(或插装的)类的字节码的新字节数组。这种模型允许快速有效地传输类,并且与前面的一些方法不同,它不需要本地组件参与工作。

实现 SpringRunner 测试用例中的动态 BCI 有两步:首先,必须重新编译 org.runtimemonitoring.spring.EmpDAOImpl 类,将上面的测试用例中的静态 BCI 移除。其次,JVM 启动选项需要保留 -Djboss.aop.path=[directory]/jboss-aop.xml 选项,并且要按如下的方式添加 javaagent 选项:

-javaagent:[directory name]/jboss-aop-jdk50.jar

清单 18 展示了一个稍微修改过的 jboss-aop.xml 文件,它说明了动态 BCI 的优势:

清单 18. 缩减的动态 BCI jboss-aop.xml 文件

<interceptor class="org.runtimemonitoring.aop.ITracerInterceptor"   scope="PER_VM"/> <interceptor class="org.runtimemonitoring.aop.PreparedStatementInterceptor"   scope="PER_VM"/> <bind pointcut="execution(public * $instanceof{org.runtimemonitoring.spring.DAO}->get(..))">   <interceptor-ref name="org.runtimemonitoring.aop.ITracerInterceptor"/> </bind> <bind pointcut="execution(public * $instanceof{java.sql.Connection}->prepareStatement(..))">   <interceptor-ref name="org.runtimemonitoring.aop.ITracerInterceptor"/> </bind> pointcut="execution(public * $instanceof{java.sql.PreparedStatement}->executeQuery(..))">   <interceptor-ref name="org.runtimemonitoring.aop.ITracerInterceptor"/> </bind>

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

时间:2011-02-13 IBM Nicholas Whitehead

动态 BCI 的好处之一就是可以插装任何类,包括第三方库,所以清单 18 展示了 java.sql.Connection 所有实例的插装。然而它更强大的能力是可以把任何(但可用的)截取程序应用到定义的切入点。例如,org.runtimemonitoring.aop.PreparedStatementInterceptor 是一个普通的但却与 ITracerInterceptor 有些不同的截取程序。截取程序的整个库(在 AOP 用语中常指方面(aspects))都可以被开发,并可以通过开源提供商获得。这些方面库可以提供广泛的透视图,根据您想要应用的插装类型、要插装的 API 的不同,或者两者均不同,这些透视图的用途也不一样。

图 14 展示了其他指标的指标树。注意通过使用 Spring 中的 Jakarta Commons DataSource 提供者,有几个类实现了 java.sql 接口。

图 14. 动态 BCI 指标树

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

对比一下 WrappingJDBC 插装技术和使用 BCI 插装的驱动程序的性能差异,BCI 方法最大的优点就很明了了。这点在清单 15 中有所展示,清单 15 展示了 PreparedStatement.executeQuery 的对比运行时间:

图 15. BCI 对比包装性能

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

第 2 部分结束语

在这篇文章中我介绍了很多种插装 Java 应用程序的方式,目的是为了跟踪 APM 系统的性能监控数据。我所展现的这

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号