入门:内存泄漏分析

内存泄漏(在 Java™ 中,经常由于对象不恰当地占有引用而引起的)会降低性能并最终导致程序崩溃。“概要分析和记录”透视图中包括用于分析应用程序中的内存使用情况和检测这些泄漏的视图。

下列视图可用于内存泄漏分析:

找出一个泄漏之后,可以使用 Probekit 设计定制探针来调查可能正在泄漏的特定对象。

要快速找出疑似泄漏对象,通过使用“内存泄漏分析”概要分析集进行概要分析来执行内存泄漏分析。还可以通过使用“内存分析”概要分析集进行概要分析来检查内存使用情况;可以使用“对象引用图”、“对象引用”和“对象详细信息”视图浏览此数据,但是不能使用该数据来生成疑似泄漏对象的列表。

执行内存泄漏分析

内存泄漏分析使用高级算法来根据两个堆转储的比较结果找出潜在的内存泄漏。可以将概要分析配置定义为允许您手工捕获堆转储,也可以定义为在概要分析集中指定的时间自动捕获堆转储。

先决条件:

要分析泄漏:

  1. 在“概要分析”对话框的“概要分析”选项卡中,选择内存泄漏分析 - 手工堆转储内存泄漏分析 - 定时堆转储概要分析集。
  2. 单击概要分析以启动应用程序。 “疑似泄漏对象”视图将打开并显示概要分析运行的状态信息。
  3. 如果要捕获手工堆转储,执行以下操作:
    1. 充分准备应用程序:在内存中具备了所有应具备的内容之后才使用应用程序。多次执行您想要调查的事务。
    2. 通过单击“疑似泄漏对象”视图中的“捕获堆转储”按钮 “捕获堆转储”按钮 来捕获第一个堆转储。将把该堆转储作为概要分析资源添加到“概要分析监视器”中。
    3. 再执行几次您想要调查的事务。
    4. 捕获第二个堆转储。现在,您就可以终止应用程序了。
  4. 如果要捕获定时堆转储,则允许应用程序一直运行,直到“疑似泄漏对象”视图指示已经捕获了两个堆转储并且您可以开始分析为止。缺省情况下,10 分钟(600 秒)之后就会捕获第一个堆转储,再过 10 分钟之后就会捕获第二个堆转储。现在,您就可以终止应用程序了。
  5. 在“疑似泄漏对象”视图中,单击“分析泄漏”按钮 “分析泄漏”按钮
  6. 选择泄漏分析选项对话框中,单击确定。完成分析之后,“疑似泄漏对象”视图就会列示出在第二个堆转储时,堆中仍占有引用对象的那些对象,并且将最有可能泄漏内存的对象列示在最前面。
  7. 双击最有可能的疑似泄漏对象,以在“对象引用图”视图中显示该对象。 该图将突出显示泄漏根(占有引用的对象)与潜在的泄漏对象之间的路径;这使您能够在图中浏览。通过将光标停留在任何对象或路径段上,可以显示关于该对象或路径段的统计信息。这样,可以调查正被占用的内存大小,并考虑是否可以除去任何引用。
  8. 双击“对象引用图”视图中的对象,以便在“对象详细信息”视图中显示对象信息。 该视图以表格格式显示有关当前对象的所有信息,包括关于对象的引用对象(引用当前对象的对象)以及被引用对象(当前对象所引用的对象)的其它数据。

现在可以修改您的代码以清除不再有用的引用,以便垃圾收集器可以收集不需要的对象。再次对应用程序进行概要分析,以验证是否已修正该泄漏并检测其它泄漏。

有关更多信息,请阅读分析内存泄漏

使用内存分析调查内存使用情况

具有“基本内存分析”概要分析类型的“内存分析”概要分析集使您能够收集对象引用和查看堆转储。请注意,可以在“对象引用图”、“对象引用”和“对象详细信息”视图中查看该数据,但是不能使用它来生成疑似泄漏对象的列表。

要调查内存使用情况:

  1. 在“概要分析”对话框的“概要分析”选项卡中,选择内存分析概要分析集。请注意,此概要分析集不能自动找出疑似泄漏对象。
  2. 单击概要分析以启动应用程序。
  3. 运行要分析的应用程序部分。
  4. 在“概要分析监视器”中,右键单击代理程序概要分析资源并单击收集对象引用。现在您可以终止程序了。在“概要分析监视器”中会显示具有为该运行收集的数据的概要分析资源。
  5. 要显示对象引用,右键单击概要分析资源,然后单击打开方式,接着单击您想要显示的视图的名称。
反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.