练习 1.2:捕获堆转储

在开始之前,必须已完成练习 1.1:导入必需的资源

场景

您的组织具有三层排队系统,该系统是 Web 代理应用程序的一部分。排队系统的每层都有其自己的队列。 测试团队已经确定应用程序有内存泄漏,并且怀疑发生在排队系统中。 作为其中一个队列的开发者,您被分配了确定哪层应该负责此内存泄漏的作业。

概述

要执行内存泄漏分析,您需要捕获两个 Java 堆转储。

运行时,是 Java 虚拟机(JVM)用于存储 Java 对象的内存块。Java 堆内存由垃圾收集器管理,该垃圾收集器为没有剩余引用的 Java 对象自动取消分配内存。

堆转储是特定时刻堆的内容的映像。

您需要两个堆转储,这样您可以查看在应用程序运行的两点间,内存用途是如何更改的。 有一个内置算法比较这些堆,并识别不应在内存中时却停留在内存中的对象。 该算法分析以下指示符以识别潜在泄漏:两个堆转储之间整个时间间隔都在内存中的对象, 第二个堆中特定类的对象数的增长,以及到一个对象的引用数。

准备捕获堆转储

要捕获堆转储,必须切换到“概要分析与记录日志”透视图:

  1. 从 Software Development Platform 菜单栏中,选择窗口 > 打开透视图 > 其它...,打开“选择透视图”对话框。
  2. 在对话框的左下部,单击显示所有。 复选框会出现一个选中标记。
  3. 从透视图列表中,选择概要分析与记录日志并单击确定
  4. 如果打开了“确认启用”对话框,单击总是启用功能,不要再次询问,然后单击确定
  5. Software Development Platform 切换至“概要分析与记录日志”透视图。

捕获堆转储

对于此教程,您将手动捕获堆转储。(另外,您可以设置自动捕获堆转储的时间间隔,或导入现有堆转储。)

要捕获堆转储:

  1. 运行应用程序:
    1. 从菜单栏中,选择运行 > 概要分析...。打开“概要分析”对话框。
    2. 在“配置”列表中,双击 Java 应用程序。将在列表中显示 New_configuration 条目。
    3. 在“名称”字段中,输入 ThreeTierQueue_MemLkAnalysis
    4. 在“主要”选项卡中“项目”字段的旁边,单击浏览。打开“项目选择”对话框。
    5. 选择 ThreeTierQueue,然后单击确定
    6. 在“主要类”字段的旁边,单击搜索
    7. 在“选择主要类型”对话框中,选择 TestThreeTierQueue,然后单击确定
    8. 在“概要分析”对话框中,单击“概要分析”选项卡。
    9. 在“概述”子选项卡中,选中“内存泄漏分析 - 手动堆转储”概要分析集的复选框。 (概要分析集定义要为运行收集的概要分析数据的类型。)
    10. 单击概要分析。运行应用程序并显示更改如下:
      • 进程的“概要分析”资源显示在“概要分析监视器”中。
      • 打开“疑似泄漏对象”视图,并显示带有关于下一步做什么的指示信息的“当前状态”消息。
        注意:如果收到了代理控制器不可用的安全性消息,请阅读如果不能收集数据
  2. 捕获堆转储:
    1. 从菜单栏中,选择窗口 > 显示视图 > 控制台打开“控制台”视图,这样您可以在应用程序运行时跟踪它。
    2. 让应用程序预热大约半分钟,以确保您想概要分析的所有类都已装入并初始化。
    3. 安装“疑似泄漏对象”视图中的指示信息:单击“捕获堆转储”工具栏按钮 以捕获基线堆转储,它是堆比较的起点。 附加概要分析资源现在显示在“概要分析监视器”视图中,一个是“自动泄漏检测”,一个是您刚捕获的堆转储。
    4. 让应用程序再运行一分钟,并再次按照“疑似泄漏对象”视图中的指示信息,用同样的方法捕获第二个堆转储。 第二个堆转储的概要分析资源显示在概要分析监视器中。
    5. 在“控制台”视图中单击“终止”按钮 以终止进程。

如果不能收集数据

在可以收集任何种类的概要分析数据之前,必须正在运行代理控制器。 如果收到了代理控制器不可用的消息,请确保代理控制器已安装,手动启动它并再次尝试。有关指示信息,请参阅安装指南。您可以使用启动板访问安装指南,或者在产品 CD 的 disk1/install.html 下找到它。

收集数据以后,您就可以开始练习 1.3:分析“疑似泄漏对象”

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.