Quest JProbe最佳实践指南.docx
《Quest JProbe最佳实践指南.docx》由会员分享,可在线阅读,更多相关《Quest JProbe最佳实践指南.docx(17页珍藏版)》请在冰豆网上搜索。
![Quest JProbe最佳实践指南.docx](https://file1.bdocx.com/fileroot1/2022-11/24/26acaa2c-8efb-4429-aad2-f07597476e4a/26acaa2c-8efb-4429-aad2-f07597476e4a1.gif)
QuestJProbe最佳实践指南
Java和J2EE业务应用程序中的性能非常重要。
当数以千计的用户使用您的应用程序时,您不能承担忽略影响应用程序可靠性和伸缩性的问题所带来的风险,和承担性能瓶颈、内存泄漏、进程以及未测试代码等问题。
您也不能承担在系统体系结构上再继续花费。
造成应用程序中代码错误通常由于代码虽然是源代码,然而许多开发组在开发高性能过程中不能执行最佳的操作。
因此您必须管理性能,管理风险。
JProbeSuite5.0是Java最佳的性能协调组件包,提供了高级的、高灵活性的Java应用程序协调,而不管其在本地运行还是在远程运行。
组件包中包括:
JProbeProfiler、JProbeMemoryDebugger、JProbeThreadalyzer和JProbeCoverage。
JProbeProfiler
JProbeProfiler是一个前沿的Java工具。
JProbeProfiler帮助开发者快速的诊断Java代码中性能瓶颈。
伴随着高精确度的诊断,以及一行行的输出结果,开发者将大大改善应用程序性能。
随着客户Java应用程序和J2EE应用程序的大小和复杂性的增长,对快速分析能力的工具的需求也逐渐增强。
JProbeProfiler5.0动态的改善了分析时间,能使用户的处理速度提高10倍。
主要特性
方法和行级分析-定位快速方法,逐步测量每行性能。
测量占用或CPU时间-跟踪最终用户感觉的性能或计算瓶颈
9个性能矩阵-识别性能问题的实际来源
高级过滤和触发器-零化代码临界区
快照差分-识别代码变化对性能的影响
高级打印和输出-用AcrobatPDF打印性能分析;将列表数据发送到文本,HTML或类似于Excel的CSV格式
JProbeMemoryDebugger
JProbeMemoryDebugger帮助开发者快速发现Java代码中的内存泄漏,降低应用程序中内存的使用。
Java开发人员能采用JProbe易于使用的查看器,导航和分行结果,可视化在内存使用和空闲对象中的复杂数据。
提供了下列优点:
消除了花费较大的内存循环、动态提高内存消耗和应用程序性能、指出产生闲散对象的原因、采用强大的触发器零化重要代码以及良好的协调的数据集合并附带高级API。
我们为JProbeMemoryDebugger5.0添加了更多新特性,所有这些特性都是为了减少您寻找内存泄漏的时间。
主要特性
识别内存泄漏-采用易用的2按钮分析和对象阀值来跟踪运行时的内存增加
内存实例计算器-计算内存泄漏多少
智能内存分析-采用LeakDocotor精确定位内存泄漏的可能来源
引用图和实例详细信息-跟踪内存使用和对象引用
基于树的实例详细视图-通过对象引用快速跟踪内存泄漏
垃圾收集分析-监测寿命周期短的对象和垃圾收集详细信息
快照差分-识别代码变化对内存使用的影响
JProbeThreadalyzer
线程为您的应用程序提供同时处理多项任务的功能。
主要用于建立高性能,可缩放的应用程序,同时在服务器端Java开发中占有非常重要的地位。
多线程应用程序具有不加任何警告而停止业务应用程序的缺陷。
JProbeThreadalyzer能够监测影响应用程序性能的线程错误。
强大的锁定分析器能帮助您在问题发生之前预测线程中的问题。
容易使用的可视化器显示了您分析的结果,以至于您能快速的获取与线程相关的问题的根本。
主要特性
可视化图-观察线程状态的变化
锁定分析器-在产生问题之前,预测死锁和数据跟踪情况
监测异常同步-避免数据错误
JProbeCoverage
为了确保能精确的测试Java运行应用程序,开发者需要知道要测试多少代码量以及在何处找到未测试的代码。
JProbeCoverage帮助您定位未测试代码,精确测量执行的代码量。
最终将产生高质量,耗时短的应用程序。
JProbe5.0动态的改善了分析时间,使用户的处理速度提高了10倍,特别改善了Profiling和代码覆盖部分。
除了以前版本中提供的直线和方法级报表,JProbeCoverage5.0新特性就是能生成类级覆盖报表。
主要特性
覆盖浏览器和源代码视图-快速分离未检测代码和死代码
批处理模式-能以批处理模式运行,方便的集成建立/测试系统
报表-以XML,文本,类似于Excel的CSV和HTML形式输出覆盖快照数据,用以定制分析
快照合并-合并多个平台运行的整个覆盖数据
QuestJProbe最佳实践指南
作者:
铸锐数码-编译发文时间:
2004.10.13
1.介绍
在Java的广泛应用中,一个关键驱动因素是由于使用标准类库和应用框架从而提高了生产效率。
通过减少必要的设计,实现和调试等软件开发任务,Java在各种平台之间极大地改善了集成性和互操作性;其它的开发环境都不能提供像Java那样的强大功能。
实际上,没有一个环境像J2EE那样具有明显的基于框架开发的优点,J2EE能够快速地构建可扩展,分布式的安全企业级应用。
虽然这些优点一直在促进J2EE的空前发展,但也经常出现一些麻烦,那就是人们经常对J2EE应用的性能感到失望。
因此,我们需要一些工具和调查策略来帮助J2EE开发团队解决这些性能问题。
这就是QuestJProbeProfiler和JprobeMemoryDebugger所要解决的问题。
1.1J2EE性能概揽
一般情况下,最终用户对J2EE应用性能的体验与下面层次是紧密相关的:
J2EE体系结构图
J2EE应用是指servlets,JSPs,EJBs和支持类,它们在J2EE应用服务器的上下文环境中构成了客户的应用。
J2EE应用服务器是指J2EE应用服务器基础结构的设计,实现和配置,它们提供了客户J2EE应用的上下文环境。
JAVA运行环境是指JAVA虚拟机及其配置(堆的大小等等)的设计和实现。
平台-底层硬件(如CPU的数目,内存的大小,I/O子系统等)和操作系统设计,实现和配置(线程和进程调度,子系统优化,整体负载等)。
虽然毫无疑问,底部层次会影响整个性能,经验也不断地表明,性能下降的普遍原因是由组成J2EE应用的Servlets,JSPs和EJBs的设计问题和不佳的实现造成的。
本文将集中讨论在这个底层中如何识别出性能下降的原因。
1.2概述
本文描述了在BEAWebLogicServer6.1上下文环境中,怎样用QuestJProbeMemoryDebugger和Profiler分析J2EE应用。
包括三个主要部分:
设置-在介绍JProbe的体系结构之后,我们将描述怎样把JProbeMemoryDebugger和Profiler集成到WebLogicServer6.1环境中。
对象循环分析-在J2EE应用中,性能下降的普遍原因是创建过多的短期对象(也可称为对象循环)。
在这部分里,我们将展示怎样使用JProbeMemoryDebugger'sGarbageMonitor识别大量创建短期对象的方法。
这些是进一步分析减少创建过多对象的最佳方法。
J2EE性能分析-最后,我们将使用JProbeProfiler向你介绍怎样进行J2EE应用的性能分析,并且在语句级上快速地识别出一些耗时最多的方法。
2.集成BEAweblogic服务器和QuestJProbe
2.1QuestJProbe
QuestJProbe产品线由一族工具组成,该族工具包括下面四个分析工具。
JProbeMemoryDebugger-检查Java软件的内存使用情况。
JProbeProfiler-剖析Java软件的性能。
JProbeThreadalyzer-识别线程级的死锁和错误的访问冲突
JProbeCoverage-通过提供的语句级执行信息验证测试框架的完整性。
虽然本文集中讨论了JProbeMemoryDebugger和Profiler,但所有四个工具都采用了相同的体系结构设计,并且与BEAWebLogic服务器的集成方法是相同的。
2.1.1JProbe的体系结构
一个基于JProbe的调查会话由两个程序组成:
图2JProbe体系结构
JProbe控制台是一个基于Swing的Java应用,它提供了用户图形界面(GUI),用于建立调查会话,在程序运行时查看分析信息和深入分析Snapshot文件中的信息内容。
测试型Java虚拟机-JProbe通过JVMPI(JavaVirtualMachineProfilingInterface)提供的回调方法,使用标准的Java虚拟机运行Java应用并收集分析信息,该虚拟机是由厂商提供的。
在剖析基于WLS的J2EE应用中,Java应用运行在Java虚拟机中,该虚拟机由WebLogic服务器的基本框架组成,就象J2EE应用部署到上面一样。
这种结构具有非常灵活的启动方式。
你可以从用户图形界面本身启动测试型Java虚拟机,也可以单独启动测试型Java虚拟机并且使它连接上JProbe控制台。
2.2使用JProbeApplicationServerIntegrationTool
1.启动JProbeApplicationServerIntegration。
2.从左上角下拉列表中选择你要集成的BEAWeblogic服务器版本。
图3JProbeApplicationServerIntegration窗口
3.点击"Create"按钮。
编辑窗口右边的内容,如图3所示。
4.编辑下面区域或使用默认值。
IntegrationID:
JProbeDemo1
IntegrationID,便于重用每次集成过程
ServerDirectory:
D:
\bea\wlserver6.1
直接输入WLS服务器根路径或者通过"浏览"方式输入。
DomainName:
Mydomain
输入你想分析的域名。
StartupScript:
StartWeblogic.cmd
直接输入要调查的服务器的启动脚本或者通过"浏览"方式输入。
JProbeSettings:
(JPLFile)
checktheVARcheckbox
集成工具允许你使用先前创建的JPL(JProbeLaunchpad)文件。
如果要使用由每个工具在启动时默认创建的JPL文件,选择VAR复选框。
JavaExecutable:
d:
\sun\jdk1.3.1\bin\Java.exe
可直接输入或通过浏览方式输入Java虚拟机的执行文件路径。
5.点击"Advanced>>"按钮。
6.填写下面这区域。
JavaOptions:
-classic-mx128m-ms64m有选择地给Java虚拟机输入参数。
7.点击"Save"按钮。
图4.JProbeApplicationServerIntergation窗口
你已经成功创建和BEAWeblogic6.1的集成,所有四个工具都可以使用这个集成过程。
8.点击"Close"按钮。
3.识别J2EE应用性能下降
JProbeMemoryDebugger能帮助你追踪到游离对象(loiteringobjects)和减少创建过多的对象,并且JProbeProfiler能帮助你发现性能瓶颈。
根据具体情况,需要具体分析。
在这里,我们简单地概括用于解决对象循环和性能瓶颈这两个常见问题的步骤。
更多的信息和其它使用JProbeMemoryDebugger和JprobeProfiler的方法,可以参考在线帮助或者阅读JProbeMemoryDebuggerGuide和JProbeProfilerDeveloper'sGuide。
3.1对象循环(ObjectCycling)
Java应用性能下降的一个主要原因是创建过多的对象(或称为对象循环)。
Java虚拟机分配了过多的内存,创建了不必要的对象并对这些对象的初始化,加大了垃圾回收活动,从而引起性能下降。
作为一个性能分析人员,你首先需要识别出创建大量短期对象的方法。
这些方法是进一步做减少创建对象数量分析的理想入手点。
JProbeMemoryDebugger提供的一个垃圾监视功能可以把对象和分配它们的方法连接起来,并且当你的应用运行时,可以追踪有多少对象已经被垃圾回收了。
3.1.1启动JProbeMemoryDebugger的研究会话
1.启动JProbeMemoryDebugger。
当欢迎界面出现的时候,点击"Run"开始启动。
图5.JProbe欢迎界面
2.在JProbeLaunchPad窗口中:
a.选择"UsingApplicationServer"
b.从"ApplicationServer"下拉的菜单中选择BEAWeblogic6.1
c.注意在"IntegrationID"下拉的菜单中填写JProbeDemo1
3.选择"Filter"
a.点击"Pleaseenterapackage,ormethodtodisplaydatafor"。
输入你要调查的包:
.quoteme.stockwatch
b.在"Display"栏的下拉菜单里选择"Display"
4.选中"MonitorGarbageCollectionsfromProgramStart"复选框。
5.选择"SnapshotDirectory:
"为d:
\temp。
6.点击"Run"按钮。
图6.JProbeLaunchPadPad窗口
当WebLogicServer初始化时,RuntimeHeapGraph将增高,这反映了对象创建和垃圾回收活动。
一旦WebLogicServer已经被充分初始化后,你就可以开始着手分析了。
3.1.2运行时交互
一旦WebLogicServer已经充分初始化,选择你想要用于分析对象循环的应用用例。
选择GrabageMonitor标签,按下面的步骤:
1.首先运行一次GarbageCollection,回收在Java堆中分配的,但不再使用的对象。
GarbageMonitor表随时更新反映这些被回收对象的情况。
2.点击"ClearTable"清空GarbageMonitor表。
3.运行你的应用用例。
当Java虚拟机开始垃圾回收时,GrabageMonitor表将随之更新。
提示:
在HeapUsageChart中寻找负载峰值。
急剧升降的负载峰值意味着一些对象在被垃圾回收之前只存活了很短的时间。
连在一起的一些急剧升降的负载峰值是一个明确的信号,意味着是一个对象循环问题。
4.在完成你应用用例后,再次运行GarbageCollection,回收最后分配但不再使用的对象。
3.1.3分析结果
当会话结束时,GarbageMonitor中包含了已回收最多实例的前十个类。
通常,这些类不是你自己应用的类,准确地说,它们是被你的一些方法(直接地或间接地)分配的第三方的类。
最后一列是分配这些已回收对象的方法名。
提示:
如果被不同方法分配的实例属于同一个类,并且都是前十个类的话,你将见到两行相同的类。
1.使用FilterAllocatingMethods,只显示你包中的一些方法,屏蔽掉其它包中的方法。
在我们的例子中,客户J2EE应用定义在.quoteme.stockwatch包里面,所以我们把过滤规范.quoteme.stockwatch.*.*输入到FilterAllocatingMethods文本输入控制中。
2.在GC'ed列中,你能看到你的方法分配了多少实例。
作为比较,查看Alive列就能看到还有多少实例仍在堆中。
Java开发者通常会对创建和移走了多少对象而感到惊奇。
3.现在你已经识别到你有问题的方法。
想想你可能怎样修改这些分配对象的方法,从而减少或排除对象循环?
例如,你可以尝试重用某个对象或者创建一个可重用的对象池。
4.WebLogicServer6.1编译JSP后,自动产生了一个servlet类名,并赋予一个包名和类名。
例如,如果有一个名为TestJSP.jsp的JSP文件,将被编译成名为jsp_servlet.__testjsp的类(JSP名跟着两个下划线,并且都是小写字母)。
用FilteringClasses为jsp_servlet.*限制GarbageMonitor中的内容,可以看到已经被垃圾回收到GarbageMonitor中的JSP。
在FilteringAllocatingMethods设置jsp_servlet.*.*或jsp_servlet._<你的JSP名>.*限制GarbageMonitor中的内容,可以从分配的角度在指定的JSP中查看垃圾回收对象。
更深入的研究
如果你分配的方法没有一个出现在GarbageMonitor中,或者在修改明显的问题后,仍然有对象循环的问题;你需要进行堆栈跟踪,检查哪个方法的调用导致了创建实例并分配了空间。
需要使用heapsnapshot查看堆栈跟踪。
要了解更多的信息,请看在线帮助里的GarbageCollectionTutorial或者JProbeMemoryDebuggerDeveloper'sGuide。
3.2性能分析
解决对象循环问题有助于性能的改进,但你可能仍然面临着性能瓶颈。
进行一次性能分析可帮助你在J2EE应用中识别低效率的算法。
JProbeProfiler提供了应用的方法级和源代码行级度量值。
3.2.1启动JProbeProfiler调查会话。
1.启动JProbeProfiler。
当欢迎界面出现时,点击"Run"开始。
图8JProbe欢迎窗口
2.在JProbeLaunchPad窗口中:
a.选择"UsingApplicationServer"
b.从ApplicationServer下拉菜单中选择BEAWeblogic6.1
c.注意在IntegrationID下拉菜单中填JProbeDemo1
3.选择Filter
a.点击Pleaseenterapackage,class,ormethodtodisplaydatafor。
输入你要调查的包.quoteme.stockwatch
b.从DetailLevel列的下拉菜单中选择LineLever
这个元素定义了我们想要把所有运行在环境中的Java软件看作基础结构。
因为我们不想详细了解它们的性能信息(我们只是想知道在代码上的影响,我们不想更细地分析)
提示:
在WLS6.1中的JSPProfiling当JSP被WebLogicServer6.1编译时,产生的servlet被给予一个产生的包和类名。
例如,如果有一个名为TestJSP.jsp的JSP文件,它被编译后,生成名为jsp_servlet._testjsp的类(两个底线被JSP名跟着,都是小写字母)。
如果你想跟踪你的JSP里的方法在执行中花了多少时间,你必须指定正确的过滤策略,用于捕获数据。
4.选择"CPUTime"
5.选择"RecordPerformanceatProgramStart"复选框
6.选择"aSnapshotDirectory:
"为d:
\temp
7.点击"Run"按钮
图9JProbeProfilerLaunchPad窗口
3.2.2运行时交互
在性能分析中,HeapUsageChart就象一个执行进度的监视器,与上节介绍的GarbageMonitor不同,这里不提供类似的运行时性能信息。
使WebLogicServer自己初始化到完全启动。
作为对象循环分析,我们推荐使用应用级的,以用例为中心的方法进行性能分析,具体如下:
1.清空累积的性能数据。
2.运行你的应用用例。
3.执行一次性能快照,保存性能信息。
性能快照包括时间和在用例运行期间对象创建等度量数据(这个运行期间从重新设置性能信息开始-第一步,一直到执行快照结束,第三步)。
3.2.3解释结果
JProbeProfiler提供两个工具,以不同的格式显示收集到的数据;可根据具体情况选择:
MethodList是指以表的形式显示与方法有关的数据信息。
使用MethodList可以按照名称或度量值排序,或显示只显示其中部分方法。
CallGraph--是指以有向图的形式显示方法。
可以使用CallGraph查看并跟踪程序中方法间的调用关系。
从MethodList或CallGraph中,你能使用下面这些工具深入到更多的细节数据。
MethodDetailView是指对于所选的方法,显示它们是被哪些方法(也称父方法)调用了或它们调用了哪些方法(也称子方法)。
SourceWindow显示所选方法的语句级性能信息。
3.2.3.1TimeandObjectCreationMetrics
JProbeProfiler在方法方面收集了三个基本度量值:
NumberofCalls是指在会话期间该方法被调用的次数
MethodTime是指执行该方法所花费的总时间
MethodObjects是指该方法创建的对象总数
在这些基本的度量值基础上,JProbeProfiler计算出两种度量值表示方法调用树:
CumulativeTime是指执行这些方法的时间,和执行它们直接或间接调用的方法所花费时间的总和。
CumulativeObjects是指这些方法创建的对象,和这些方法直接或间接调用其它方法创建的对象的总合
基于NumberofCalls用四种平均度量值:
Avg.MethodTime是指调用方法的时间除以调用次数
Avg.MethodObjects是指方法对象除以调用次数(方法对象指方法执行期间创建的对象数,不包括派生对象创建的数)
Avg.CumulativeTime是指累积时间除以调用次数
Avg.CumulativeObjects是指累积对象除以调用次数
在默认情况下,CallGraph显示的数据是在性能快照中的数据。
我们建议你关闭CallGraph一会再打开MethodList窗口。
3.2.3.2MethodList
MethodList窗口(见图10)以表的形式显示性能数据。
图10JProbeProfilerMethodList窗口
每一行显示了方法的时间和方法创建对象