安装 PurifyPlus
如下列步骤所示,安装 PurifyPlus 是一个直截了当的过程:
- 下载 PurifyPlus 并通过 GUI 安装。当遇到提示时,只需点击 Next 按钮,直到产品安装完毕。
- 下载 License Server 并按照类似方法安装。
- 配置 License Server 指向 PurifyPlus 提供的版本许可号
图 1 例举了如何在安装 License Server 之后进行配置。License Server 应该为您的本地主机的名称。
图 1:配置 License Server
4. 接下来,如图 2 所示,配置 License 使用映射程序(Settings > License Usage Mapper)。对于 Rational Purify、Quantify,和 PureCov,在右边的选项卡上,选择 Rational PurifyPlus for Windows,并且取消选择其他选项。
图 2:配置 License Usage Mapper
5. 现在通过浏览您保存的位置导入 License Key 文件。您将在 License Key Administrator 向导中看到 License Key,如图 3 所示。
图 3:License Key Administrator 向导
现在,准备启动 PurifyPlus。
要让 PurifyPlus 在 .NET 上工作,您需要执行以下一些步骤:
- 到 <Install_directory for Rational>\Common 并运行 AspNetMon.exe。在程序运行过程中,您将看到右手下方系统托盘中的交通灯图标。
- 单击右键,并选择 Enable .NET profiling for Rational PurifyPlus。
- 启动 Rational PurifyPlus 并附加要净化的进程。然后:
- 等待两分钟
- 观察 PurifyPlus 是否稳定(一段时间后图象应该稳定了)
- 查看 w3wp.exe 是否在 Task Manager 中出现多次
- 如果是,停止 aspnetmon.exe,杀掉所有 w3wp.exe 进程并重新启动 AspNetMon.exe。
- 打开客户端 Web 页面(您需要启动新的浏览器来进行此操作)。这将创建一个 w3wp.exe 进程。
- Purify 应该自动地显示出概要图(对于 w3wp.exe)。
- 点击 Run。
- 继续运行 PurifyPlus
首先选择 Start > All Programs 并且启动 IBM Rational PurifyPlus > Purify。图 4 显示了 Rational Purify 启动窗口。
图 4:您启动 PurifyPlus 时的第一个窗口
对于托管代码,使用选项“Memory profiling data”。对于非托管代码,使用选项“Error and leak data”。
在执行您的应用程序的过程中,PurifyPlus 将依附在进程上。
当您在选择“Memory profiling data”选项的情况下运行应用程序时,PurifyPlus 将显示一张描述了内存使用量的图。您可以继续浏览您感兴趣的 Web 页面,并且同时您将注意到图上的变更。
举例来说,当加载 Web 页面时,图上的曲线将成指数级增长,这显示在加载 Web 页面时使用了巨大量的内存。当加载之后,图像将稳定,而在您浏览其他页面时再次变更。
一旦应用程序开始运行,结果将自动地显示。图 5 显示了 PurifyPlus 中的概要图。
图 5:当 PurifyPlus 启动时的内存概要图
您可以为您正在分析的应用程序,在其运行过程中保存内存概要数据的“快照”,以便您可以之后更详细地观察。快照包含一组关于积累到一个具体时刻的程序状态和量度信息的数据。
要用 PurifyPlus 创建快照,只需在 Purify 工具栏中点击照相机图标。PurifyPlus 对当前数据进行快照,并且在 Navigator 中创建快照入口,同时继续记录数据。您可以将快照保存到PurifyPlus 数据文件(.pmy)或者保存到ASCII 文本文件(.txt)中。图 6 显示了 PurifyPlus 快照的样子。
图 6:PurifyPlus 快照
图 7 例举了 .NET 应用程序的 PurifyPlus 快照。
图 7:.NET 应用程序的快照自 Rational PurifyPlus 的结果
PurifyPlus 提供许多不同的窗口来帮助您执行内存概要数据的详细分析,每个窗口如下详细介绍:
- Data browser 窗口—— 在 Memory 选项卡中显示执行的概要数据,在 Call 图、Function List 视图,和 Object List 视图选项卡中显示内存概要数据。
- Function Detail 窗口—— 显示关于具体的 Java 或 .NET 托管方法,及其直接调用者和子调用的数据。该数据以表格(对于聚集运行和快照)和图形格式显示。
- Object Details 窗口—— 包含关于具体对象的详细信息。
要显示 Data Browser 窗口,就在 Purify 菜单中选择 View > Data Browser,或单击您在 Navigator 中已经选择的执行的图标。您将在 Data Browser 窗口中看到 Memory 选项卡、Call graph 选项卡、Function List 视图、Object List 视图。
Memory 选项卡概述了程序的总内存使用,以及在运行过程中在哪里分配了多少内存(参见图 8)。
图 8:Memory 选项卡显示了描述在应用程序运行时使用的内存量的图。
Function List View 选项卡(参见图 9)列出了程序使用的所有函数和方法,没有按模块或文件分组。此视图帮助根据各种各样的标准对数据排序,并且帮助找到感兴趣的方法和函数,并且显示或隐藏(Show/Hide)它们。
图 9:Function List View 显示了应用程序调用的函数,以及它们使用的内存量。
函数默认从最高内存使用率到最低内存使用率,以便您可以集中到消耗最大内存的函数上。这些列可以按正序或倒序排序。
Call Graph 选项卡提供应用程序调用结构的图形表示(参见图 10)。它给出了在应用程序运行过程中使用的内存或 CPU 时间的整个描述。
图 10:实例 Call Graph
Call Graph 选项卡显示了函数调用的序列,以及它们使用的内存。粗线和细线帮助您分别区分消耗内存多或少的函数(参见图 11)。Call Graph 还突出了从代价最高的函数回到程序的一开始的路径,较粗的线表示代价较高的路径。您可以根据各种各样的标准突出其他函数。
图 11:Call Graph 中的较粗的线表示内存密集的函数。
如果您双击任意这些方法(参见图 11 中的矩形框),您将看到如下所述的 Function Detail 窗口。
Data Browser 窗口中的 Object List 选项卡(参见图 12)列出了当前选择的内存概要数据集中的所有根对象,或者列出了单个对象引用树中的所有内存对象。
图 12:Object List 选项卡及其特性的实例
如果在 Settings 对话框的 PowerCheck 选项卡中选择了“Generate Object Reference Graph data”,并且在 Preferences 对话框的 Workspace 选项卡中选择了“Show Object List View”的话,才可以使用 Object List 选项卡。
如果您为对象收集数据,那么在 Purify 菜单中选择 View > Data Browser,或单击图标并选择 Object List View 选项卡来显示对象列表。
Object List View 可以显示以下信息:
- 对象、类文件,和方法名称
- 受引用对象的数量,及对其他对象的引用
- 对象当前字节数
- 对象 + 引用(object + references,O+R)大小
- 对象的创建时间以及生存的垃圾集合的数量
- 如果有的话,显示
- 源代码中创建对象的位置的大约行数
- 对于根对象,显示根类型
要显示 Function Detail 窗口,在 Data Browser 窗口中单击 Call Graph 或 Function List View 选项卡,然后双击方法名,或者选择方法并单击图标。Function Detail 窗口显示关于具体的 Java 或 .NET 托管方法及其直接调用者和子调用的数据。
在该视图中以图形或表格形式显示的信息类型是(参见图 13):
- 方法数据—— 方法本身的详细的内存数据。
- 调用者数据—— 一列直接调用者及其详情。
- 子调用数据—— 一列直接子调用及其详情。
- 对象数据—— 如果方法创建了对象,那么该窗口还包含一列所选择的方法目前分配的所有对象。
图 13:Function Detail 窗口
只有当在 Settings 对话框的 PowerCheck 选项卡中选择了“Generate Object Reference Graph data”时,Object Details 窗口才可用(参见图 14)。
图 14:选择“Generate object reference graph data”选项以查看 Object Details 窗口。
Object Details 窗口出现在您:
- 在 Object List View 选项卡中双击对象时
- 在 Function Detail 窗口中双击对象时
- 选择对象,并单击右上部的 PurifyPlus 工具栏中的图标时(参见图 15)
图 15:Object Details 视图图标的位置
图 16 显示了 Object Details 窗口的实例。
图 16:Object Details 窗口及其特性的实例
注意 Object List View 按如下进行分组和显示对象:
- 当您在为所选择的聚集执行或快照数据集中的对象打开 Object Details 窗口之前,Object List View 显示了所选择的数据集中的所有根对象。
- 当您为所选择的数据集中的对象打开 Object Details 窗口之后,Object List View 只显示 Object Reference Graph 中显示的对象。
- 当您关闭 Object Details 窗口之后,Object List View 重新显示所有根对象。
-
以下是一些使用 PurifyPlus 时要铭记于心的重点:
- 您应该启用 Purify,然后来到第一页。记住依附 Purify 将迫使 App Pool 进行回收。Web 应用程序将丢失所有在会话状态中未保存的数据,并且在一些设计很糟的 Web 应用程序中可能引起未预期的行为。
- .NET 应用程序不在 IIS 进程中运行。它们在 W3WP(工人进程或应用程序池)中运行。
作为参考,这里概述了 PurifyPlus 在 .NET 环境中如何工作:
- 当您启用 Purify 时,AspNetMon 进程杀掉了工人进程(应用程序池)。
- IIS 检测到应用程序池消失。
- IIS 立即启动新的。
- AspNetMon.exe 打断了进程创建。
- 它清除了新的进程环境内存。当 Purify 依附上之后,直到工人进程结束。
此处介绍了一些在 .NET 应用程序中检测到内存泄漏时查看源代码的技巧:
- 内存泄漏本身不会出现在 .NET 应用程序中。相反,.NET 有 GC 堆。
- 通过 PurifyPlus 快照特性的帮助,您可以分析对象或方法级内存使用。
- 不显示行数。当您切换到注释源代码时,使用此信息。然后直接带您到达行。
- 在默认设置或 Application 设置中,.NET 拥有对行和函数模式的选择。
- 只有在 Line 模式下才可以看源代码(参见图 17)。
图 17:设置选项查看源代码
- 如果您从 Function Detail 视图切换到 Annotated Source,那么您将看到函数源代码。
- 如果您从 Object Detail 视图切换,您将来到分配的位置。
- 在您来到源代码之前,您必须确定未释放的对象并找出谁持有它们。
- 函数模式下不保存源代码级别信息。Application 设置覆盖了默认设置。
- 有两种使用行信息的方式:
- 在调用图中定位函数
- 从对象信息定位对象分配的行
您还可以在命令行设置
图 18 显示了如何查看源代码文件。
图 18:如何查看源代码文件