内容


IBM Rational Application Developer的运行时问题决断

Comments

Illustration大多数开发者知道 J2EE 开发是困难的。在分层的、分布式应用中,难以隔离并解决性能瓶颈,识别未测试的代码,诊断内存泄漏的根源,并检查间歇出现的故障。一个运行时问题决断解决方案对这些挑战会有所帮助。

运行时问题决断包含几个技术点,包括:

  • 内存配置和泄漏分析
  • 性能配置和分析
  • 线程分析和调试
  • 探测
  • 代码覆盖分析
  • 日志分析

在这篇文章中,我将讨论IBM Rational Application Developer(正式的名称是Websphere Application Developer或WSAD)为执行这些技术提供的技术

支持快速开发并部署Web,Web services, Java, J2EE和portal应用程序,快速应用程序开发,或 RAD 的集成IDE,由Eclipse开源平台提供,支持多供应商的运行时环境。1它用自动化工具帮助开发者提高代码质量,这些工具可以提供代码标准评审,组件和Web Service单元测试,和分层运行时分析。

可用于 RAD 中的运行时问题决断建立于Hyades,一个集成的,基于Eclipse的测试,跟踪和监视工具之上。通过RAD的配置及日志透视图,他们提供视图以帮助使用者分析J2EE和J2SE应用问题,这些问题是关于内存泄漏,性能瓶颈和线程瓶颈 – 所有造成不良运行性能的可能原因。其他的视图帮助使用者定位在配置运行期间,代码覆盖的间隔。而 RAD 的 Probekit 提供了在存在的代码中编写或插入 Java 代码片段以探测特定的运行时问题的架构。配置对话框与运行对话框一块集成,而且预定义配置集对于使用者是可用的,如图 1 所示。

图 1:Rational Application Developer (RAD)中的预定义配置集

图 1:Rational Application Developer (RAD)中的预定义配置集

图 1:Rational Application Developer (RAD)中的预定义配置集

(点击这里放大)

让我们更详细地讨论在 RAD中可用的一些运行时问题决断技术。

内存配置和泄漏分析

在 Java 中,当对象被不适当地引用时,内存泄漏时常发生。这样的泄漏会降低性能并最终导致程序当机。RAD的配置和日志透视包含一些视图,用来分析你的应用程序的内存使用,和通过比较两个堆转储的高级算法来检测这些泄漏。当你指明配置集时,你可以手动或自动地定义一个预定义配置取得这些转储。 你也可以用多种形式引入堆转储。2

RAD为内存泄漏分析提供了以下视图:

  • 泄漏候选视图: 确定最有可能造成内存泄漏的对象。
  • 对象引用视图和对象细节视图: 提供对象占用内存的信息。
  • 统计视图: 显示包,方法,类和实例的基本配置统计。

图 2 中的截图高亮度标示了一个内存泄漏(字符串对象正在泄漏),连同泄漏的包装形态(矢量对象)和根(TestThreeTierQueue 对象)。借由如此高度指明的信息,使用者可以更容易地隔离并修正内存泄漏。对象引用视图和对象细节视图也为十个泄漏最严重的对象高亮度计数,这有助于手动分析。

图 2: RAD 视图高亮度显示内存泄漏信息。

图 2: RAD 视图高亮度显示内存泄漏信息。

图 2: RAD 视图高亮度显示内存泄漏信息。

(点击这里放大)

性能配置和分析

性能瓶颈是阻止应用程序以可能的最快速度运行的编码段。配置和日志透视包括若干的视图,它用于配置运行时性能,并帮你检查瓶颈:

  • 性能调用图方法细节视图(见图 3)
  • 包统计,类统计方法统计视图
  • 方法调用,方法调用表,执行流,执行流表UML2 序列图视图

在性能调用图视图 (图 3)中,线的粗细指出应用程序沿着代码路径花费的时间。明显地,在这种情况下应用程序在 Thread.sleep() 方法中花费太多时间。方法细节视图证实了这一点,表现在高亮度标示的Thread.sleep() 花费了 85% 的子节点时间。图 3 也显示了调用图视图如何高亮度显示最耗时的前十个方法。

图 3: RAD 性能调用图视图

图 3: RAD 性能调用图视图

图 3: RAD 性能调用图视图

(点击这里放大)

线程分析和调试

线程瓶颈,如竞争和死锁,会减慢你的应用程序并导致当机。配置和日志透视包含了视图工具,以帮助你检查并解决这些线程问题:

  • 线程视图和 UML2 序列图视图,尤其是 UML2 对象相互作用视图
  • 执行流和执行流表视图

在线程视图中,垂直的箭头从请求锁的线程,指向持有锁的线程。一支单独的箭头指出一个线程竞争:一个线程正在等候另一个线程释放一个锁。如果多个箭头显示一个环形的锁请求模式 – 由于它们正在相互等候其它线程释放锁,所以线程彼此阻止运行 – 结果就形成了一个死锁。你可以循环得到垂直的箭头以获得正在保持的锁的详细信息。

线程视图也提供 UML2 序列图视图与Hyades的同步。在线程视图列表中,选择保持你想要调查的锁的线程;UML2 对象相互作用视图将会显示所选的线程的对象相互作用,包括锁和请求。然后,放置当前时间指示器,于你想要调查的请求的箭头,将使UML2相互作用视图与在配置监视器中的调用栈配置资源同步。

图 4: RAD 中的 UML2 序列图视图

图 4: RAD 中的 UML2 序列图视图

图 4: RAD 中的 UML2 序列图视图

(点击这里放大)

探测

探测器是你能用于监视应用程序的运行时行为的特定特性的 Java 代码片段。RAD 为应用这项技术提供了 Probekit 工具。一个 Probekit 文件可以包含一个或多个的探测器,而且每个探测器能包含一个或多个的探测器片段。当你想要运行探测器片段的时候,你能指定你想要在给定程序上使用哪个探测器。探测器片段集成于一组 Java 方法内,然后它们被编译。当一个探测器被编译的时候,它的探测器代码片段与标准的样板文件组合产生新类的Java源码。从探测器片段产生的函数,显示为生成的探测器类的静态方法。

当你应用探测器时,字节代码插入 (BCI) 引擎指向探测器列表和它们的目标模式,并调用探测器片段方法插入到目标程序。调用片段插入目标方法的过程名为“instrumentation”。一个探测器片段 (举例来说,方法名称及参数)请求的数据项目作为参数传递。这种系统的一个好处是,一个探测器可以使用少量的开销,插入到大量的目标方法。探测器可以在方法入口,方法出囗,调用位置,异常捕获等地方插入。如图 5 所示,一个带有入口片段的探测器文件在编辑器中高亮度标明并打开。

图 5:显示一个方法数据片段的RAD Probekit 的一个来源文件视图

图 5:显示一个方法数据片段的RAD Probekit 的一个来源文件视图

图 5:显示一个方法数据片段的RAD Probekit 的一个来源文件视图

(点击这里放大)

代码有效性分析分析

RAD 配置和日志透视包含了一些视图,它们用于识别你的代码中未受过测试的代码行及方法。当你配置一种运行以分析性能或线程瓶颈,你也可以监视代码覆盖,以确保你已经试运行了你的应用程序的所有的适当部分,使用两类视图:

  • 覆盖细节视图,只有当你收集了方法和行覆盖以后才有效:
    • 覆盖导航视图,它在覆盖层面上列出应用程序的类和方法
    • 修饰词源码视图,它显示在你的源码副本的覆盖修饰词
  • 代码覆盖统计视图

图 6: RAD 的修饰词源码视图

图 6: RAD 的修饰词源码视图

图 6: RAD 的修饰词源码视图

(点击这里放大)

使用修饰词源码视图,你能见到显示类,源文件,甚至整个包在多重运行中覆盖率的图和表。这在组件测试中非常有用,如你可以在封装之前确认未测试代码并检查它。图 7 显示了两个未经测试的文件,因为他们包含在运行时从不被载入的类。除此之外,文件 ThreeTierQueue.java只有 63% 的代码被测试过,这是关心的原因。

图 7: RAD 修饰词源码视图显示测试代码覆盖论题

图 7: RAD 修饰词源码视图显示测试代码覆盖论题

图 7: RAD 修饰词源码视图显示测试代码覆盖论题

Probekit 使用探测器收集行水平的代码覆盖数据,使用一个运行时库收集,并定期输送到基于Eclipse的RAD视图显示出来。

日志分析

除了上面描述的技术,RAD也封装了一个日志和追踪分析器,一个接口,这个接口提供单独的操作,处理一个部署系统的不同组件产生的日志和追踪。追踪和日志工具的连接有助于建立问题诊断与应用程序、中间件调试之间的桥梁。

通过在分布的客户应用程序堆栈中捕获端对端的事件,并使之相互关联,该工具提供更多的分布式应用程序问题的结构化分析。它也使调试和解决系统的问题变得更加早期和快速。通过日志和跟踪分析器,你可以引入不同的日志文件,如根据症状数据库来分析并纠正日志文件。除此之外,一个通常的日志适配器允许你处理应用程序日志文件,并把它们的内容转变成一个通用的基本事件格式,这提供了一个日志,管理,问题判断和自动化计算的标准。使用一致的格式,简化了使得支持相同目标的工具间的通讯。使用普通的基本事件对象,你可以用一致的格式,来开发通用的说明性事件,并可以开发工具以支持你的目标。

总结

Rational Application Developer,即RAD,提供一些新的技术,以帮助开发者精确地查找运行时性能和内存相关问题的根源。它提供基于跟踪的运行瓶颈分析,及线程间的锁竞争。内存分析允许使用者精确地查找Java和 J2EE 应用程序中的内存泄漏。开发者也可以通过代码覆盖视图,获得组件的代码行级别的代码覆盖率的细节,他也可以用Probekit为调试或日志建立定制的探测器。所有这些技术的目标,是使 J2EE 开发者变得更加轻松。

脚注

1随便举些例子,包括 AIX,HP-UX, z/OS,OS/400,Red Hat Linux,Sun Solaris,SuSe Linux和Windows 2000/2003/XP。

2IBM®堆转储格式,Hprof堆转储格式,IBM OS/390堆转储格式,和Hyades 优化的堆转储格式。


相关主题

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=161793
ArticleTitle=IBM Rational Application Developer的运行时问题决断
publish-date=02152005