Quest JProbe最佳实践指南(下)

  

3.2 性能分析

        解决对象循环问题有助于性能的改进,但你可能仍然面临着性能瓶颈。进行一次性能分析可帮助你在J2EE应用中识别低效率的算法。JProbe Profiler提供了应用的方法级和源代码行级度量值。

3.2.1 启动JProbe Profiler调查会话。

                1. 启动JProbe Profiler。当欢迎界面出现时,点击"Run"开始。

                图9。JProbe欢迎窗口

        2. 在JProbe LaunchPad窗口中:

                a. 选择"Using Application Server"

                b. 从Application Server下拉菜单中选择BEA Weblogic6.1

                c. 注意在Integration ID下拉菜单中填JProbe Demo 1"

        4. 选择Filter

                a. 点击Please enter a package,class,or method to display data for。输入你要调查的包profiler.com.quoteme.stockwatch

                d. 从Detail Level列的下拉菜单中选择Line Lever

                这个元素定义了我们想要把所有运行在环境中的Java软件看作基础结构。因为我们不想详细了解它们的性能信息 (我们只是想知道在代码上的影响,我们不想更细地分析) 提示:在WLS6.1中的JSP Profiling

                当JSP被WebLogic Server6.1编译时,产生的servlet被给予一个产生的包和类名。例如,如果有一个名为TestJSP.jsp的JSP文件,它被编译后,生成名为jsp_servlet._testjsp的类(两个底线被JSP名跟着,都是小写字母)。 如果你想跟踪你的JSP里的方法在执行中花了多少时间,你必须指定正确的过滤策略,用于捕获数据。

        5. 选择"CPU Time"

        6. 选择"Record Performance at Program Start"复选框

        7. 选择"a Snapshot Directory:"为d:\temp

        8. 点击"Run"按钮

                图11。 JProbe Profiler LaunchPad窗口

3.2.2 运行时交互

 

        在性能分析中,Heap Usage Chart就象一个执行进度的监视器,与上节介绍的Garbage Monitor不同,这里不提供类似的运行时性能信息。使WebLogic Server自己初始化到完全启动。

        作为对象循环分析,我们推荐使用应用级的,以用例为中心的方法进行性能分析,具体如下:

        1. 清空累积的性能数据

        2. 运行你的应用用例。

        3. 执行一次性能快照,保存性能信息。

        性能快照包括时间和在用例运行期间对象创建等度量数据(这个运行期间从重新设置性能信息开始-第一步,一直到执行快照结束,第三步)。

3.2.3 解释结果

        JProbe Profiler提供两个工具,以不同的格式显示收集到的数据;可根据具体情况选择:

  • Method List是指以表的形式显示与方法有关的数据信息。使用Method List可以按照名称或度量值排序,或显示只显示其中部分方法。
  • Call Graph--是指以有向图的形式显示方法。可以使用Call Graph查看并跟踪程序中方法间的调用关系。

             从Method List或Call Graph中,你能使用下面这些工具深入到更多的细节数据。

  • Method Detail View是指对于所选的方法,显示它们是被哪些方法(也称父方法)调用了或它们调用了哪些方法(也称子方法)。
  • Source Window显示所选方法的语句级性能信息。

    3.2.3.1 Time and Object Creation Metrics

            JProbe Profiler在方法方面收集了三个基本度量值:

  • Number of Calls是指在会话期间该方法被调用的次数
  • Method Time是指执行该方法所花费的总时间

            Method Objects是指该方法创建的对象总数

            在这些基本的度量值基础上,JProbe Profiler计算出两种度量值表示方法调用树:

  • Cumulative Time是指执行这些方法的时间,和执行它们直接或间接调用的方法所花费时间的总和。
  • Cumulative Objects是指这些方法创建的对象,和这些方法直接或间接调用其它方法创建的对象的总合

            基于Number of Calls用四种平均度量值:

  • Avg.Method Time是指调用方法的时间除以调用次数
  • Avg.Method Objects是指方法对象除以调用次数(方法对象指方法执行期间创建的对象数,不包括派生对象创建的数)
  • Avg.Cumulative Time是指累积时间除以调用次数
  • Avg.Cumulative Objects是指累积对象除以调用次数

            在默认情况下,Call Graph显示的数据是在性能快照中的数据。我们建议你关闭Call Graph一会再打开Method List窗口。

    3.2.3.2 Method List

            Method List窗口(见图12)以表的形式显示性能数据。

                    图12。JProbe Profiler Method List窗口

            每一行显示了方法的时间和方法创建对象的度量值。使用Method List能很快识别你最耗时的方法。通常你会发现你的性能瓶颈和这些方法有关。

            如果你是第一次调查,跟着下面这些步骤将使你能更有效地使用Method List。

            1. 选中你的snapshot,打开"Method List"。

            2. "Filter"区域只用于显示在你包中或在你感兴趣的类中的方法。

            3. 点击"Method Time"列名,把你最消耗时间的方法排在最前面。仔细查看前十个。是不是有一些度量值令你惊讶?你能改进你方法中的算法吗?

            4. 点击"Cumulative Time"列名,把最消耗时间的调用树排在最前面。比较一下"Method Time"和"Cumulative Time"。虽然方法本身可能效率很高,但也可能调用了低效率的方法,这些低效率的方法可能在你的代码中,或者在第三方的包或应用框架中。

            5. 点击"Number of Calls"列名,查看一下你哪个方法被调用最多。如果一个或多个度量值同时反映这些方法是低效率的,需要考虑减少调用这些方法,或调用那些效率稍好的方法。

    3.2.3.3. Call Graph

            Call Graph(见图13)提供一个非常有力的方法调用关系视图。它把J2EE应用放到WebLogic Server上下文环境中,所以你能看到WebLogic启动的所有线程,包括调用J2EE应用的线程。为了方便查找,Call Graph下面有"Method List"。

            当分析性能时,在定位J2EE应用的入口点和排除与WebLogic线程有关的数据方面, Call Method是最有效的。在分离出应用的数据基础上,可快速画出执行流程,并用图形清晰地显示出来。

            下面是使用Call Method的有效技巧:

            1. 选中你的snapshot,打开"Call Graph"

            2. 点击"Find"并且定位你的J2EE应用的入口位置。通常是servlet中的doGet()或doPost()方法。

            3. 选择方法并分离出数据形成图形

            4. 显示方法的一个子集作为开始,这些方法按照"Cumulative Time"排序是最耗时的方法。当你分析一个方法,在方法的调用树上将增加额外的节点。

            5. 在"Method List"中,根据你发现的瓶颈位置,在"Color By"的下拉列表中选择相同度量值。根据你选择的度量值,现在最耗时的方法都以鲜艳的颜色突出显示出来。

            6. 选择最耗时的方法。展开父方法树(通过点击节点部分或节点左边部分的空箭头记号),就能看到哪个方法调用它了。你可以调用不同的,耗时比较少的方法吗?你需要经常调用这些方法吗?

            7. 展开子方法树(指向节点的右边),可以看到调用了哪个耗时的方法。还有哪些子方法也是耗时的呢?你意识到第三方的方法实际的耗时情况吗?你能调用一个实现了更有效率算法的不同方法吗?

                    图13。JProbe Profiler Call Graph窗口

            从Method List或Call Graph中,你都能深入地分析,在一个视图中很方便地看到耗时的方法的度量值,还有它们子方法和父方法的度量值。选择方法并打开"Method Detail View"

            "Method Detail View"(见图14)在窗口的中心显示了选择方法,它的父方法在上面,它的子方法在下面。我们对列的头部已经熟悉了,它们和你在其它工具中看到的度量值相同。一个重要的区别是:用于显示父方法和子方法度量值表示对所选方法的贡献值,不是对它们自己的度量值。所以,如果一个方法被调用了12次,这些调用它的方法,和12次调用分别显示在父方法的图中。如果你想继续分析父方法或子方法,双击该方法,使该方法在"Method Detail View"的中心显示。

                    图14 JProbe Profiler Method Detail窗口

    3.2.3.5 Source Window

            要查看你方法中的代码,选择方法并且打开Source Window。你需要指出你的源代码具体位置。

            如果你是按行收集数据,你能在Source Window(见图15)中看到这些数据。在左列中,显示了每条语句的数据度量值。行级度量值是方法级度量值的细化,包括调用次数,执行该行的时间,执行该行时创建的对象数量,累积时间和累计对象数量。

            提示:如果需要编辑你的代码,并且已经把集成开发环境IDE和JProbe Profiler集成在一起了,你可以通过选择Edit>Edit Source打开你的集成开发环境。当然,需要运行你重写的代码,并建立新的JProbe Profiler分析会话时,你做的改变才反映在JProbe Profiler上。

                    图15 Jprobe Profiler Source Window