练习 1.2:捕获堆转储
在开始之前,必须完成练习 1.1:导入必需的资源。
场景
您的组织具有三层排队系统,该系统是 Web 代理应用程序的一部分。排队系统的每层都有其自己的队列。
测试团队已经确定应用程序有内存泄漏,并且怀疑发生在排队系统中。
作为其中一个队列的开发者,您被分配了确定哪层应该负责此内存泄漏的作业。
概述
要执行内存泄漏分析,您需要捕获两个 Java 堆转储。
运行时,堆是 Java 虚拟机(JVM)用于存储 Java 对象的内存块。Java 堆内存由垃圾收集器管理,该垃圾收集器为没有剩余引用的 Java 对象自动取消分配内存。
堆转储是特定时刻堆的内容的映像。
您需要两个堆转储,这样您可以查看在应用程序运行的两点间,内存用途是如何更改的。
有一个内置算法比较这些堆,并识别不应在内存中时却停留在内存中的对象。
该算法分析以下指示符以识别潜在泄漏:两个堆转储之间整个时间间隔都在内存中的对象,
第二个堆中特定类的对象数的增长,以及到一个对象的引用数。
准备捕获堆转储
要捕获堆转储,必须切换到“概要分析与记录日志”透视图:
- 从 Software Development Platform 菜单栏中,单击窗口 > 打开透视图 > 其它。“选择透视图”对话框打开。
- 在对话框的左下部,单击显示所有。一个选择标记将出现在复选框中。
- 从透视图列表中选择概要分析和记录,然后单击确定。
- 如果打开了“确认启用”对话框,单击总是启用功能,不要再次询问,然后单击确定。
- Software Development Platform 就切换到“概要分析和记录”透视图。
捕获堆转储
对于此教程,您将手动捕获堆转储。(另外,您可以设置自动捕获堆转储的时间间隔,或导入现有堆转储。)
要捕获堆转储:
- 运行应用程序:
- 从菜单栏中,单击运行 > 概要分析。“概要分析”对话框打开。
- 在“配置”列表中,双击 Java 应用程序。将在列表中显示 New_configuration 条目。
- 在“名称”字段中,输入 ThreeTierQueue_MemLkAnalysis。
- 在“主要”选项卡中“项目”字段的旁边,单击浏览。打开“项目选择”对话框。
- 选择 ThreeTierQueue,然后单击确定。
- 在“主要类”字段的旁边,单击搜索。
- 在“选择主要类型”对话框中,选择 TestThreeTierQueue,然后单击确定。
- 在“概要分析”对话框中,单击“概要分析”选项卡。
- 在“概述”子选项卡中,选中“内存泄漏分析 - 手动堆转储”概要分析集的复选框。
(概要分析集定义要为运行收集的概要分析数据的类型。)
- 单击概要分析。应用程序就会运行并显示更改,如下所示:
- 进程的“概要分析”资源和表示“自动泄漏分析”概要分析类型的条目显示在概要分析监视器中。
- 打开“疑似泄漏对象”视图,并显示带有关于下一步做什么的指示信息的“当前状态”消息。
注意:如果收到了代理控制器不可用的安全性消息,请阅读如果不能收集数据。
- 捕获堆转储:
- 从菜单栏中,单击窗口 > 显示视图 > 控制台以打开“控制台”视图,这样您就可以在应用程序运行时跟踪它。
- 让应用程序预热大约半分钟,以确保您想概要分析的所有类都已装入并初始化。
- 安装“疑似泄漏对象”视图中的指示信息:单击“捕获堆转储”工具栏按钮
以捕获基线堆转储,它是堆比较的起点。表示堆转储的其它条目显示在概要分析监视器中。
- 让应用程序再运行一分钟,并再次按照“疑似泄漏对象”视图中的指示信息,用同样的方法捕获第二个堆转储。
第二个堆转储的条目显示在概要分析监视器中。
- 在“控制台”视图中单击“终止”按钮
以终止进程。
如果无法收集数据
必须先运行“代理控制器”才能收集任何种类的概要分析数据。如果接收到“代理控制器不可用”消息,确保已安装“代理控制器”,手工启动它,然后再试。有关指示信息,请参阅安装指南。您可以使用启动板访问安装指南,或者在产品 CD 的 disk1/install.html 下找到它。
收集数据以后,您就可以开始练习 1.3:分析“疑似泄漏对象”。