Java 运行时监控第 2 部分 编译后插装和性能监控.doc

Java 运行时监控第 2 部分 编译后插装和性能监控.doc

ID:55631588

大小:722.00 KB

页数:37页

时间:2020-05-21

Java 运行时监控第 2 部分 编译后插装和性能监控.doc_第1页
Java 运行时监控第 2 部分 编译后插装和性能监控.doc_第2页
Java 运行时监控第 2 部分 编译后插装和性能监控.doc_第3页
Java 运行时监控第 2 部分 编译后插装和性能监控.doc_第4页
Java 运行时监控第 2 部分 编译后插装和性能监控.doc_第5页
资源描述:

《Java 运行时监控第 2 部分 编译后插装和性能监控.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、简介正如您在本系列(共三篇文章)的第1部分中所了解到的,监控Java应用程序的可用性和性能及其生产中的依赖性,这对于确保问题检测和加速问题诊断和修复至关重要。需要进行监视的类的源代码级插装具有第1部分所论述过的那些优势,但是这种方法通常都不可取或者不切实际。例如,很多您所感兴趣的监控点可能位于第三方组件中,而第三方组件的源代码您是不得而知的。在第2部分中,我着重介绍了无需修改原始源代码而插装Java类和资源的方法。可选择的在源代码外编排插装的方法有:·截取·类包装·字节码插装本文使用了第1部分中呈现的ITracer接口来实现性能数据跟踪,依次举

2、例阐明了这些技巧。通过截取进行Java插装截取的基本前提是通过一个截取构造和收集传入的入站与出站调用信息,对特定的调用模式进行转换。一个基本的截取程序的实现会:1.获取对入站调用请求的当前时间。2.取回出站响应的当前时间。3.将运行时间作为两次度量的增量计算出来。4.将调用的运行时间提交给应用程序性能管理(APM)系统。图1展示了该流程:图1.性能数据收集截取程序的基本流程清晰的界限变更管理的爱好者可能会对通过源代码实现变更和通过配置实现变更之间的差异持有争议。诚然,“代码”、XML和“脚本”之间的界限变得有些模糊了。但是下面两个变更之间还存在

3、明显的界限:·需要改变源代码的变更,接着还要编译、打包,有时还会涉及到一系列看起来无休止的预部署过程·对(未改变的)二进制代码外部的资源所作的变更这两种变更之间最主要的差异是实现前滚(roll-forward)和后滚(roll-back)的简单性。在某些情况下,这种差异可能在理论上说不通,或者可能低估了某些环境的复杂度或变更过程的严格性。很多诸如JavaPlatform和EnterpriseEdition(JavaEE)这样的Java框架都包括对截取栈的核心支持,服务的调用可以在截取栈中通过一系列预处理和后处理组件来进行传递。有了这些栈就可以很

4、好地将插装注入到执行路径中,这样做的好处有二:第一,无需修改目标类的源代码;第二,只要将截取程序类插入到JVM的类路径中并修改组件的部署描述符,这样就把插装截取程序插入到了执行流程中。截取的核心指标截取程序所收集的一个典型的指标就是运行时间。其他的指标同样适合截取模式。我将介绍支持这些指标的ITracer接口的两个新的方面,所以在这里我要转下话题,先简要论述一下这些指标。使用截取程序时需要收集的典型指标有:·运行时间:完成一个执行的平均时钟时间。·每个时间间隔内的调用:调用目标的次数。·每个时间间隔内的响应:目标响应调用的次数。·每个时间间隔内

5、的异常l:目标调用导致异常的次数。·并发性:并发执行目标的线程数。还有两个ThreadMXBean指标可以选择,但它们的作用有限,而且收集成本会高一些:·运行CPU时间:这是线程在执行期间消耗的CPU时间,以纳秒为单位。CPU的利用情况在起初时似乎有用,但其实也就是作为一种趋势模式,其他的用处不大。或者,如果收集成本特别高的话,可以计算线程在执行时占用CPU资源的百分比的近似值。·阻塞/等待计数和时间:等待表示由具体线程调度导致的同步或者等待。阻塞常见于执行等待资源时,如响应来自远程数据库的Java数据库连接(JavaDatabaseConne

6、ctivity,JDBC)调用(至于这些指标的用处,请参见本文的JDBC插装部分)。为了澄清ThreadMXBean指标的收集方法,清单1快速回顾了基于源代码的插装。在这个例子中,我针对heavilyInstrumentedMethod方法实现了大量插装。清单1.实现大量插装的方法1.protected static AtomicInteger concurrency = new AtomicInteger();2..3..4.for(int x = 0; x < loops; x++) {5.   tracer.startThreadInfo

7、Capture(CPU+BLOCK+WAIT);6.   int c = concurrency.incrementAndGet();7.   tracer.trace(c, "Source Instrumentation", "heavilyInstrumentedMethod", 8.      "Concurrent Invocations");9.   try {10.      // ===================================11.      //   Here is the method12.      

8、// ===================================13.      heavilyInstrumentedMethod(fa

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。