Java/J2EE应用Profiler整合:调试类型和调试流程

日期: 2011-11-23 作者:Madhu Tanikella翻译:刘志超 来源:TechTarget中国 英文

调试是一项用来识别同级应用程序代码的性能瓶颈的技术,并且相应的调优应用程序的代码。在基于web和多层应用的背景下,调试需要在应用服务器/中间件层去处理,因为那里有很多业务逻辑处理。本文的重点是简单的描述调试的组件和流程,分享一些特定情况下的Java应用程序的集成调试工具的实践挑战,列出一些建议,可以使分析和调优活动有效的进行。   “调试”一词源自,理解和分析应用程序所用的各种方法所花费的时间,调用和/或子程序和内存的使用情况。

这项技术用来找出特定的应用程序中,花费较多的方法/调用/子程序,致力于性能优化和调优。另外,代码花费的时间也被称为“延迟”,在多层应用程序中,尤其是在服务器端,被称为“……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

调试是一项用来识别同级应用程序代码的性能瓶颈的技术,并且相应的调优应用程序的代码。在基于web和多层应用的背景下,调试需要在应用服务器/中间件层去处理,因为那里有很多业务逻辑处理。本文的重点是简单的描述调试的组件和流程,分享一些特定情况下的Java应用程序的集成调试工具的实践挑战,列出一些建议,可以使分析和调优活动有效的进行。

  “调试”一词源自,理解和分析应用程序所用的各种方法所花费的时间,调用和/或子程序和内存的使用情况。这项技术用来找出特定的应用程序中,花费较多的方法/调用/子程序,致力于性能优化和调优。另外,代码花费的时间也被称为“延迟”,在多层应用程序中,尤其是在服务器端,被称为“服务器端延迟”。

  调试也可以用来分析应用程序的内存使用情况,如对象/变量如何在运行时创建内存(如JVM Heap 或者 .NET CLR 或者本地内存),可以进一步优化应用程序的内存占用。对于多线程来说,profiling还可以发现线程同步的问题,并显示线程状态。

  本文的目的是为了列出在整合调试工具和Java/J2EE应用程序(独立的或者是基于应用服务器的)中一些最常见的实践挑战,在应用程序性能管理流程中探讨调试集成活动,工作区可以明显地帮助减少运转时间需求。

  例如,在3层web应用程序中,包含Web服务器、应用程序服务器和数据库服务器,我们可以把它看作是一个在线的业务用例或者是业务交易,采用更多的时间来应用通过浏览器访问的终端用户。高级的端对端的交易响应时间可能会呈现在客户端、Web服务器的请求/响应处理、应用程序服务的业务逻辑处理、或者是数据库服务器的查询执行。为了找出延迟很高的那一层,调试要找出服务端的时间是怎么花费的。

  调试类型

  调试大致可分为两种类型:CPU 调试和内存调试。

  CPU调试

  CPU调试主要侧重于识别Java中应用程序代码的高延迟 - 在每一个方法中,它会给出每一个业务流程花费时间的调用图。可以用两种方法来衡量延迟 - 运行时间和CPU时间。

  运行时间就是方法花费的时间,包括方法、其子方法和网络输入/输出以及硬盘输入/输出所花的时间 - 理想情况下,方法的进入和退出所持续的时间作为挂钟时间。例如,如果一个方法流程引用了Java代码中的业务逻辑执行、数据库(网络输入/输出)的SQL语句调用,这些时间为总的时间。

  运行时间 = CPU时间 + 网络输入/输出时间 + 硬盘输入/输出时间

  CPU时间是指CPU逻辑执行的方法/功能/日常开销的时间 - 所以,它不包含输入/输出或者其他延迟(如网络或者硬盘的输入/输出)的开销。上述同样的例子,CPU时间不能显示DB操作以及网络输入/输出时间的花费。

  CPU时间 = 完全花在CPU上的时间(不包括输入/输出或者一些中断延迟)

  总的来说,运行时间更有趣些 - 然而,他们每一个都提供了非常有价值的应用程序处理信息。

  如果一个方法/日常/功能的CPU时间非常高,它意味着方法/日常/功能处理密集,方法/日常/功能没有输入/输出参与。

  另外,如果一个方法/日常/功能的运行时间非常高,CPU时间很低,说明该方法/日常/功能有显著的输入/输出活动。

  极端的例子,CPU时间和挂钟时间可能会因为众多因素而不同,尤其是,如果执行的线程有一个低优先级 - 因为操作系统可以多次中断优先级低的线程。

  内存调试

  它是要分析如何在运行时创建内存(如JVM Heap 或者 .NET CLR 或者本地内存),从而优化应用程序所需的内存占用。这也可以用来找出关键问题,如应用程序的内存泄露。

  Profiler通用的体系结构

  本节提供了调试工具的通用体系结构 - 通常情况下,调试工具有两个主要组件 - 代理和控制台。

  代理有时也叫探头或分析器,它是一个组件,代码可以部署并运行在服务器上(典型的应用程序服务器)。代理会附有JVM,用JVMPI/JVMTI接口收集性能指标,把数据放到应用程序运行的主机预配置端口上。

  控制台是Java程序,通常用来获取预配置端口的数据,并把指标展示在仪表盘上。可以用来查看指标,也可以用离线分析来捕获快照。下图阐述了profiler的总体架构。

表1 Java 分析器的通用体系结构和组件

  图1 Java 分析器的通用体系结构和组件

  调试流程

  使用Java分析器时,需要使用Java应用服务器/Java独立的程序,Java代理需要附有JVM,从而分析应用程序。这个过程称为“集成代理”或“集成分析”。这项工作是添加特定的参数到应用服务器启动脚本的JVM中,或者是引用独立的Java程序。

调试流程

图2 调试活动的流程

  以后各节着重介绍基于Java应用服务器的调试应用。在《Java/J2EE应用Profiler整合&治理实践挑战》中,我们会继续介绍Java/J2EE应用的Profiler整合所面临的问题和挑战以及解决方法。

相关推荐