[此文档是初定版,随时可能进行更改。]

JavaScript 内存分析器在 Visual Studio 2012 更新 1 和 Visual Studio 2013 中提供,旨在帮助你了解内存使用量和查找使用 JavaScript 为 Windows 生成的 Windows 应用商店应用程序中的内存泄漏。

JavaScript 内存分析器可以为你执行以下操作:

  • 通过强调最相关的数据帮助你在应用程序中快速查找内存使用情况问题。

    你将以快照摘要形式收到此数据,其显示两个快照之间的差异,并提供指向更详细视图的链接。

  • 提供控制器、类型和根的视图来帮助隔离问题。

  • 减少 JavaScript 堆数据中的不可操作的信息。

    还可按对象名称筛选数据。

在本主题中:

运行 JavaScript 内存分析器
检查内存使用量
隔离内存泄漏
查看实时内存使用量摘要
查看快照摘要
查看快照详细信息
查看快照差异
在对象树中查找对象
筛选数据
查看共享对象引用
显示内置对象
保存诊断会话文件
将源代码与内存使用量数据关联
确定内存问题的提示

如果工作的 Windows 应用商店应用程序在 Visual Studio 中打开或安装在运行 Windows 8 或 Windows 8.1 预览版 的计算机上,则可使用内存分析器。

运行内存分析器

  1. 打开 Visual Studio。

  2. “远程计算机”

    从 Visual Studio 运行 Windows 应用商店应用程序

  3. “性能和诊断”

    “更改目标”

    以下选项可用于分析目标:

    • 如果你要在远程计算机上运行应用程序,则必须选择此选项,这是默认值。

    • 在远程计算机上运行应用程序时,不能使用此选项。

      当你无权访问源代码时,请使用此选项分析计算机上运行的应用程序的内存使用量。

    • 在远程计算机上运行应用程序时,不能使用此选项。

      如果要分析你自己的应用程序开发之外的任何应用程序的内存使用量,此选项也很有用。

  4. “启动”

  5. “是”

    与应用程序交互以测试相关的内存使用量方案并查看内存关系图,如以下各节所述。

  6. 按 Alt+Tab 切换到 Visual Studio。

查看快照摘要

隔离内存泄漏中建议的工作流。

使用以下视图来帮助确定应用程序中的内存泄漏:

  • 使用实时内存使用量摘要视图来拍摄堆的快照,这些快照在内存使用量图中显示为一个集合。

  • 使用快照摘要可链接到快照详细信息和快照差异视图。

    提示

    通常,快照差异视图将提供有关内存泄漏的最有用的信息。

  • 显示单个快照的详细内存使用量数据。

  • 这些视图将显示对象大小和对象计数方面的差异。

如果你怀疑你的应用程序有内存泄漏,这些步骤将非常有用。

  1. 在 Visual Studio 中打开应用程序。

  2. 运行 JavaScript 内存分析器

  3. 例如,这可能是在大型 DOM 刚要转变之前、加载特定页时或启动应用程序时。

  4. 切换到 Visual Studio(按 Alt+Tab)。

  5. “拍摄堆快照”拍摄基线堆快照。

    下图演示了一个基线堆快照示例:

    提示

     命令。

  6. 切换到你的应用程序并进行一些你怀疑可能导致内存泄漏的操作。

    检查内存使用量

  7. 切换到 Visual Studio 并拍摄第二个快照。

  8. 切换到你的应用程序并重复你怀疑的导致内存泄漏的操作。

  9. 切换到 Visual Studio 并拍摄第三个快照。

    下图演示了第二个和第三个快照的示例:

    例如,预计可能有一些更改(如在页面上更新页眉和页脚)会造成内存使用量的更改,但可能与内存泄漏不相关。

  10. 下面是一些提示:

    • 潜在问题(快照摘要中用蓝色信息图标标记)。

    • 绿色表示已添加的元素或对象。

      提示

      只有已添加或已修改的项表示潜在的内存泄漏。

    • 检查控制器的差异视图来快速确定使用最多内存的对象。

    • 使用这些视图可根据应用程序的已知行为来查找意外的对象大小或对象计数方面的较大变化。

  11. 用户标记以及分析器中提供的其他内存使用量数据。

  12. “在根视图中显示”

快照摘要视图。

该窗口类似于下方所示:

将源代码与内存使用量数据关联),则内存使用量图中将出现一个倒三角形,用于指示何时到达该代码部分。

当你拍摄第一个快照时,关系图中显示的内存使用量会增加,之后该使用量会对每个附加的快照按最低限度增加。

如果拍摄了两个或更多快照,则快照将提供更多信息以将其数据与前一个快照的数据进行比较。

说明

这有助于确保各个运行中的结果更加一致。

以下是你拍摄多个快照时的快照摘要的示例。

快照摘要包括:
  • 快照标题和时间戳。

  • 工具提示中将显示问题的说明。

  • 堆大小将链接到快照的控制器视图。

  • 堆大小差异将链接到快照差异的控制器视图。

  • 对象计数链接到快照详细信息的类型视图。

  • 对象计数差异链接到快照差异的类型视图。

  • 在拍摄快照时屏幕的快照。

提示

当新创建的对象的数量或大小小于已删除对象(例如,作为垃圾回收的结果)的数量或大小时,可能会出现此情况。

可以在快照详细信息视图中查看有关每个快照的内存使用量的详细信息。

例如,默认情况下,堆大小链接将在控制器视图打开的情况下打开快照详细信息。

此图显示了快照详细信息的控制器视图,以及按问题类型排序的内存使用量数据,并突出显示了潜在问题。

在快照详细信息视图中,你可以通过从工具栏中选择相应的选项来按控制器、类型或根查看内存使用量数据:
  • 工具提示提供每个问题的说明。

    提示

    控制器的差异视图可以帮助快速确定使用最多内存的对象。

  • 默认情况下,它们按实例计数排序。

  • 默认情况下,子节点按保留的大小列排序,最大的排在顶部。

所有三个视图都显示了类似的值类型,包括:

  • 例如,对于 HTML 元素,快照详细信息显示 ID 特性值(如果使用)。

  • 对象类型(例如,HTML 链接元素或 div 元素)。

  • 对象大小,不包括任何引用对象的大小。

  • 从实用的角度而言,这是对象保留的内存量,因此,如果你删除对象,则将回收指定的内存量。

  • 此值仅显示在类型视图中。

在 JavaScript 内存分析器中,可以在快照差异视图中将一个快照与前一个快照进行比较。

在快照摘要视图中,如果拍摄了两个或更多快照,则可以通过选择差异堆大小或差异对象计数链接来查看差异快照的详细信息。

快照差异显示添加到两个快照之间的堆中的任何对象。

此图显示快照差异中的类型视图。

快照差异显示与快照详细信息相同的信息,并具有以下附加值:
  • 可能的值包括:

    • 自前一个快照以来添加的对象使用绿色进行彩色编码。

    • 自前一个快照以来修改的对象使用蓝色进行彩色编码。

    • 未更改的对象不会泄漏内存。

    • 这些对象不会泄漏内存。

  • 当前快照中对象的大小及其在之前的快照中的大小之间的差异,不包括任何引用对象的大小。

  • 从实用的角度而言,保留大小是对象保留的内存量,因此,如果你删除对象,则你回收指定的内存量。

  • 此值仅显示在类型视图中。

“在根视图中显示”

在开始键入时,不包含键入字符的标识符会被筛选出来。

由于每个视图都有其自己的筛选器,因此当你切换到另一个视图时,不会保留上一个视图的筛选器。

当你在上窗格中选择一个对象时,对象引用列表将显示指向该对象的所有对象。

具有相同 ID 的对象是共享引用。

下图显示了选定项目的对象引用列表以及显示的 ID。

但是,有时查看由 JavaScript 运行时为你的应用程序生成的所有对象可能会很有用。

“显示内置对象”

“解决方案资源管理器”中,可以打开前几个会话或者删除或重命名文件。

若要帮助隔离具有内存问题的代码部分,可在 JavaScript 内存分析器中使用以下两条命令:

  • JavaScript 控制台命令之一。

  • 此说明不能超过 100 个字符。

提示

 来加速分析。

takeHeapSnapshot,请使用此代码:

if (console && console.takeHeapSnapshot) {
    console.takeHeapSnapshot();
}

performance.mark,请使用此代码:

if (performance && performance.mark) {
    performance.mark("message_string");
}

 字符串参数设置为“data generated”:

  • 隔离内存泄漏中描述的工作流操作。

  • 使用快照差异的控制器视图可帮助快速确定主要内存问题。

  • 在根视图中显示可查看在内存层次结构中引用对象的位置。

  • 当内存问题的原因时难以确定时,应使用各种视图(例如控制器和类型)查找共性,例如大小和对象计数不断增长的关联的对象和类型。

  • 管理 Windows 应用商店应用程序中的内存。

  • 例如,你可能希望:

    • 将源代码与内存使用量数据关联。)

      可以使用这两条命令来帮助隔离无法通过手动拍摄堆快照进行隔离的问题。

    • 例如,可以将一个极大对象附加到另一个对象以查明特定对象或组件是否已进行垃圾回收。

  •  函数的使用不当可能导致此问题。

 

from:http://msdn.microsoft.com/zh-cn/library/windows/apps/jj819176.aspx

相关文章:

  • 2021-12-01
  • 2022-12-23
  • 2022-12-23
  • 2021-04-02
  • 2022-12-23
  • 2021-12-29
  • 2021-10-16
  • 2021-05-07
猜你喜欢
  • 2021-05-17
  • 2021-05-17
  • 2021-08-27
  • 2021-11-19
  • 2021-04-13
  • 2021-12-24
相关资源
相似解决方案