Optimizeit Profiler概览
本文通过介绍Optimizeit Profiler的一些主要特征来使你对它有个简要的了解。如果想要知道更多的信息,请查看Optimizeit Profiler用户手册。可以从Optimizeit Profiler单击主菜单info|help来查看所有的使用文档。
使用中有何问题,请随时与Borland Technical Support联系。
启动应用程序
Optimizeit Profiler是通过在一个独立的虚拟机上运行应用程序来收集有用的信息。
在运行一个java程序前,需要安装一个java虚拟机。Optimizeit Profiler默认配置是JDK 1.4 or 1.4.1。如果你想使用的另外的虚拟机,可以查看Optimizeit Profiler用户手册中的如何增加额外的虚拟机部分。
Optimizeit Profiler可用来测试任何类型的java程序:标准的应用程序、应用小程序、servlets、jsp,ejb等。本文所使用的都是演示程序,包含在Optimizeit quichktour目录下。文中所有的演示均可以此来完成。
1、 打开Optimizeit Profiler;
2、 如果你是第一次打开,将会自动弹出编辑设置窗口。如果已经打开,可以从file菜单下选择new setting,调出编辑设置窗口。
3、 在程序类型框中选择Application。
4、 单击"Program main class or Jar file"右面的“Browse…”按钮。
5、 找到\doc\profiler\quicktour\QuickTourApp.jar文件,然后单击open。
6、 Profiler会返回到设置窗口,并且自动带入程序的工作区和类路径。在Source Path框中,单击change…按钮。
7、 在Source path chooser窗口中,选择安装路径下的\doc\profiler\quicktour目录;选中\doc\profiler\quicktour\QuickTourApp.jar文件后单击窗口中的向下按钮把它加入到source path部分。
8、 单击ok增加到源文件中路径中。设置好后的对话框如下:
9、 单击Start now按钮。
10、 编辑窗口会自动关闭,并且Optimizeit Profiler自动加载事例程序。
使用Memory Profiler
当你是第一次使用该工具,Optimizeit自动打开到内存监视窗口:
内存监视器列出了被测程序中所有的类并且实时统计每个类的实例的数目。内存监视器默认是以堆模式打开,这样能够看到对象的创建和撤销。下面的步骤将演示将介绍如何控制内存监视器以便于分析被测程序的内存使用情况:
1、 单击内存监视器表头的instance count。这样将按照已分配的实例数来进行降序排列。
2、 在内存监视器窗口下方的Filters窗口中,输入你想观察的某个类,在filters框中输入Java.awt.*,并且按回车键;这样将只显示java.awt类的相关信息。
3、 我们可以看到,许多类的实例数要么增加,要么减少。增加是因为有实例生成,而减少是因为垃圾回收在起作用。如果要查看临时对象的创建,可以选中窗口右侧底部的Disable garbage collector按钮,这样Optimizeit将一直持续显示所有实例的数目。
4、 选中java.awt.Color类,然后单击Allocation Backtrace 按钮进入allocation backtrace 模式。你也可以在类名上双击进入。Backtrace信息显示了类的每个实例中的方法被调用的信息。
5、 在Allocation Backtrace视图中,可以以两种方式来查看信息:
l Hierarchical view分层模式 默认显示树形图。在树形图中,某个方法可能显示在多个地方,在于谁调用了这个方法。但是在图形视图中,节点表示的方法仅显示一次。它仍然可以有多个父路径。
l In the Aggregated view图表模式 每个节点将使用线连接起来,或者是到了边界只有一边有线。从有多个子节点开始,每条连线对应一个调用这个方法的方法。与树形不同的是,图表中可能存在循环。图表显示有助于进行跟踪。如果你想找出一条语句是如何被调用的,那么图表将是一种快速而简易的方法,通过图表你可以迅速地找出有父子关系的对象。
可以使用按钮 在两种方式之间切换。
6、 选中EventDispatchThread.run()行,单击左边的加号展开。单击比率最大的节点,直到展开Graphics2d.fill3DRect()行为止。
7、 双击Graphics2d.fill3DRect()行,将显示颜色实例分配的源代码。源代码将有助于你理解为什么绘制路径类产生了如此多的实例。fill3DRect方法分配了许多的颜色,是因为它调用了Color.brighter() 方法and Color.darker()方法。
注意:如果你是第一次使用者,你可能没有图中的源代码路径。
使用内存监视器,可以帮助你创建更少的临时对象。虽然临时对象经常很快便被析构,然而它会导致垃圾收集更加频繁。对于大多数java虚拟机来说,当垃圾收集器比较忙时,运行任何的java程序都会延迟几百毫秒。如果使用了过多的临时对象,由于这个原因会致使用户感觉到程序反应缓慢。
内存监视器同时有助于理解为什么垃圾收集器没有析构这些对象。例如,它将帮助我们我们了解当一个对象不再被使用时确实被垃圾收集器析构掉。下面的步骤描述了使用内存监视器来判断一个实例的产生和如何被垃圾收集器收集。
1、 单击 图标返回到堆模式。
2、 为了只显示与Image-related相关的类,可以清除fileters框中的内容,然后输入*image*,然后按回车键。
3、 选中javax.swing.ImageIcon行,然后单击图标 (显示实例和参考图),显示出了实例图:
窗口的上方显示了实例的字符描述。
窗口中间部分显示了所选实例对象参考和由对象所派生的实例。在这种情况下,因为ImageIcon对象被引用了,所以垃圾收集器没有收集。
窗口最下方部分显示了中间窗口所选实例的分配路径。可以看出实例是构造器QuickTourApp分配的。这个图像就是作为背景显示在程序中间的Optimizeit的logo。
内存泄漏经常是由于在程序运行中连续地引用对象,因此他们仍然占用资源。正因为如此,如果你能够定位到使用大量引用的对象,那么你就能够定位至对象占用资源导致内存泄漏的根源。为了能够定位到使用大量引用的对象,并且跟踪这些引用:
1、 打开内存泄漏检测,单击内存泄漏监测按钮 。
2、 为了查找可能的内存泄漏,Profiler需要比较一系列堆的状态。可以单击保存堆状态按钮 来创建。
3、 让quicktour程序运行15秒以上。
4、 再次单击保存堆状态按钮记录一个新的堆状态记录。你可以创建多个堆状态记录。
5、 From heap state表中为要作为比较的初始状态,To heap state表中为要与From heap state作比较的状态。每当选中From heap state表中的记录后,To heap state表中只能选择该记录之后的记录。
6、 窗口的中间部分显示了被比较堆状态记录之后新引用的资源。Count值是这个对象递增引用的数量。可以单击count表头进行排序。你可以选择一个引用来查看堆状态中所有与这个对象引用有关的对象引用。
7、 图中的对象将有连接线或者边界。从根节点开始,都有一个相应的引用。把鼠标移到节点上面,将会显示新引用的数目和该节点调用toString()的。把鼠标移到末级节点上,将会显示这个引用的实例变量名。
8、 在图的上方有两个滚动条:
使用详细程度滚动条来调节图表显示的详细程度。
使用缩放滚动条来调节图表显示的大小。
所有不同的颜色代表不同的意思:
l 蓝色节点为间接引用句柄。表示不是直接引用,而是引用的引用。
l 红色节点为引用句柄。表示是直接引用。
l 节点的引用越多,颜色越深。
l 后续连接显示为绿色线条。后续连接在引用中对于一个对象是更高层次的引用。所有的后续连接的边框为蓝色。在引用层次中前续连接是后续连接的一个引用。
l 当选择一个节点以后,与这个节点相关的引用将会闪烁显示。
l 选中一个节点然后单击鼠标右键,将会在一个新的实例中打开所选择的节点。
使用CPU Profiler
内存监视器有助于对对象的最小化使用。CPU监视器将有助于你了解对象所使用的时间。CPU监视器在java虚拟机中可被看作是一个记录设备。下面的步骤描述了如何给出被测试程序的响应时间和CPU使用率。
1、 单击CPU监视按钮切换到CPU监视界面。
2、 单击开始CPU 监视按钮开始记录程序的CPU使用率。
3、 让程序运行一段时间(比如三秒以上)。
4、 单击停止CPU监视按钮停止记录。CPU监视器显示出了已经记录的CPU 使用信息。
5、 如果没有选上,请选择树形格式,看到的信息是一样的。
6、 单击窗口上方的下拉框可以显示出虚拟机当前运行所有的线程。
7、 选择AWT-EventQueue-0 thread线程,该线程被AWT使用来处理时间,例如repaint事件。
8、 展开EventDispatchThread.pumpOneEvent()行。
9、 单击EventQueue.dispatchEvent()左方的加号展开所有的方法,直到展开到JComponent.paintWithBuffer()方法。行前面的图标所表示的意思为:
表示该方法直接被另外一个方法调用。
表示执行时间最长的方法。
在这个例子中AWT-EventQueue-0线程一直用处理repaint事件。
10、 选择JComponent.paintWithBuffer()行。如果鼠标移到JComponent.paintWithBuffer()所调用的方法上,将显示在JComponent.paintWithBuffer()中该方法所使用的时间比例。
11、 如果要分析那个线程是空闲的,CPU监视器可以同时显示CPU使用率和使用时间。单击inspector(tool菜单下)打开inspector对话框。
12、 不选中Ony record CPU usage,然后关闭窗口。使用这个特征来选择缓冲策略,默认显示的是CPU纯使用信息。
查看虚拟机信息
Optimizert提供了实时显示与数据有关的高标准性能测试的信息。使用这个特点,你可以了解到性能问题是和CPU有关还是和内存有关,或者与两者都有关。
单击 ,切换到虚拟机模式。
在这种模式下,显示四类性能图标,每类图表描述了虚拟机不同的活动信息:
堆图表:左上角的图表中红色线表示被测程序当前需要的堆栈的大小,绿色表示被测程序实际使用的堆栈的大小。
垃圾收集图表:有上角的图中显示当前垃圾收集器的活动,显示了垃圾收集时间占总时间的比例。有助于观察垃圾收集器使用的频率和时间。
线程图:左下角的图中红色线表示当前运行的线程,绿色表示大多数的线程使用CPU。
类图:右下角的图显示了虚拟机当前加载的类的数目。
查看测试结果
Optinizeit包含了许多方法来查看测试结果,就象上面的实时监控方法成功一样,也可以把所有的信息保存在一个快照中或报告中,这样你就可以在以后分析结果或者和另外一个结果进行比较。
例如,你可以把测试结果输出为一个html文件。
1、 当演示程序还在运行时,单击CPU监视器返回到CPU监视界面。
2、 为了查看所有的信息,完全展开所有的方法。确认你需要的信息都显示在层次视图中,因为输出中不会包含图表。
3、 单击输出图标 打开输出窗口:
4、 填写标题,检查filename框中的路径是有效的,并且选择输出为.html格式。
5、 单击ok,Optimizeit会把结果输出到定义的.html文件中,然后会自动打开。
现在你就可以共享你的测试结果了。
本文只是Optimizeit Profiler的一个概览。如果想要了解更多有关Optimizeit的信息,请查看Optizeit Profiler用户指南。
翻译:
[email protected] 时间:2004-11-5