分析应用商店应用的内存使用量(VB、C#、C++)

在 Visual Studio 2013 Update 2 中,你可以使用性能和诊断中心的内存使用量工具,来分析用 C#、Visual Basic 或 C++ 和 XAML 编写的 Windows 运行时应用的内存使用情况。 尤其是,你可以:

  • 监视在制订方案时 Visual Studio 中应用的内存使用情况。 你不必使用系统和第三方工具。

  • 通过单击,创建应用的内存状态的详细快照。

  • 通过比较快照,找出细微或复杂的内存问题的根本原因。

备注

本主题介绍如何使用内存使用量工具分析 C# 应用和 Visual Basic 应用。

性能和诊断中心提供了许多选项来运行和管理诊断会话。例如,你可以在 Windows Phone 应用或 Windows 应用商店应用上运行 CPU 使用量工具,还可以在 Visual Studio 计算机、Windows Phone 或 Windows 应用商店设备上或者在某个 Visual Studio 仿真程序或模拟器中运行诊断会话。请参见从“性能和诊断”页运行分析工具

若要在使用 JavaScript 和 HTML 的 Windows 应用商店应用中分析内存使用情况,请参阅分析内存使用量 (JavaScript)

有关内存使用量工具的详细信息(包括如何分析 C++ 和 C++/Cx 应用),请参阅 Microsoft 应用程序生命周期管理博客上的使用 Visual Studio 中的新内存使用量工具诊断内存问题

启动内存使用量诊断会话

  1. 在 Visual Studio 中打开项目。

  2. 在菜单栏上,选择**“调试”“性能和诊断”**。

  3. 在性能和诊断中心页上,选择**“内存使用量”,然后选择“启动”**按钮。

    启动内存使用量诊断会话

选择分析模式

你可能正在测试本机组件以及作为启动项目的托管应用。 或者,托管应用可能只是一个测试工具,并且你只对本机内存感兴趣。 或者你可能想要了解托管应用和 Windows 运行时之间的关系。 在上述情况中,选择**“设置”**,然后选择语言或目标语言。

选择编程语言

监视内存使用情况

虽然可以使用**“内存使用量”**工具生成用于查找并修复问题的详细报告,但还可以使用它来研究你主动制订的方案的实时内存效果。

当启动诊断会话时,将启动应用并且性能和诊断页将显示该应用的内存使用情况的时间线关系图。

监视内存使用

当应用运行时,你可以尝试新功能或者研究可能出现问题的情况。 内存使用量时间线关系图显示了应用运行时该应用内存中的波动情况。

该关系图中的峰值通常表明应用中的例程正在收集或创建数据,然后在处理完成后放弃它。 较大的峰值表明你可以进行优化的方法。 更需关注的是未返回的内存消耗中出现增加,因为这可能表明低效的内存使用情况或甚至表明出现内存泄露。

关闭监视会话

停止收集

若要在不创建报告的情况下监视会话,只需关闭诊断窗口。 若要在拍摄内存快照后生成报告,请选择**“停止”**。

拍摄快照以分析应用的内存状态

若发现要调查的内存问题,你可以在诊断会话期间拍摄快照,以在特定时刻捕获内存对象。 由于应用使用大量不同类型的对象,因此你可能希望集中分析某一种情况。 还有一个较好的办法是,在出现内存问题之前获取应用的基线快照,首次出现问题后获取另一个快照,并且在重复执行该方案时获取一个或多个其他快照。

若要收集快照,请启动新的诊断会话。 在希望捕获内存数据时选择**“拍摄快照”。 若要生成报告,请选择“停止”**。

内存使用量概述页

在停止收集数据后,内存使用量工具将停止应用并显示概述报告。

“内存使用量”概述页

内存使用量快照视图

使用快照视图以在新的 Visual Studio 窗口中打开详细的报告。 存在两种类型的快照视图:

“快照”视图链接

快照视图图片中带编号的项是可以打开内存使用量报告视图的链接。

步骤 1

链接文本显示了在拍摄快照后内存中的总字节数。

选择此链接以显示快照详细信息报告,该报告按类型实例的总大小进行排序。

步骤 2

链接文本显示了在拍摄快照后内存中的对象总数。

选择此链接以显示快照详细信息报告,该报告按类型实例的计数进行排序。

步骤 3

该链接文本显示拍摄此快照时内存中对象的总大小和上一个快照的总大小之间的差异。

如果此快照的内存大于上一个快照的内存,则该链接文本将显示正数,反之,该链接文本将显示负数。 链接文本“基线”表明此快照是诊断会话中的第一个快照;“无差异”表明差异为零。

选择此链接以显示快照差异报告,该报告按类型实例的总大小中的差异进行排序。

步骤 4

此链接文本显示此快照中内存对象的总数与上一个快照中对象总数之间的差异。

选择此链接以显示快照差异报告,该报告按类型实例的总计数中的差异进行排序。

快照报告

“内存使用量”快照报表

快照报告树

托管堆

托管堆树托管堆树(快照详细信息)托管堆树(快照差异)将显示报告中的类型和实例。 通过选择类型或实例,可以显示选定项的**“根路径”“引用对象”**树。

根路径

根路径树(快照详细信息)根路径树(快照差异)将显示引用类型或实例的对象链。 .NET Framework 垃圾回收器仅在释放对某个对象的所有引用后清理该对象的内存。

引用对象

引用对象树(快照详细信息)引用对象树(快照差异)将显示选定类型或实例引用的对象。

对象类型和实例字段

在**“对象类型”项具有子项后,你可以选择箭头图标来显示它们。 若“对象类型”**文本的颜色为蓝色,你可以选择该文本以导航至其源代码文件中的对象。 该源文件已在单独的窗口中打开。

实例名是由内存使用量工具生成的唯一 ID。

提示

如果你发现无法轻松地确定某个类型,或者如果不知道如何将其包含到代码中,对此不必担心。它可能是通过内存使用量工具显示的 Framework、操作系统或编译器中的对象,因为它涉及对象的所有权链。

报告树筛选器

大多数应用都包含超乎想像的大量类型,然而应用开发人员对其中的大多数类型都不是很感兴趣。 内存使用量工具定义了两个筛选器,它们可用于隐藏**“托管堆”“根路径”**树中的大多数类型。 还可按类型名称筛选树。

对选项进行排序和筛选

筛选器

在**“筛选器”**框中输入字符串,以将树显示的内容限制为包含指定文本的类型。 筛选器不区分大小写,并且可识别类型名称任意部分中指定的字符串。

折叠小对象

在应用该筛选器后,**“大小(以字节为单位)”小于快照内存总大小的 0.5% 的类型将在“托管堆”**列表中隐藏。

仅我的代码

**“仅我的代码”**筛选器将隐藏由外部代码生成的大多数实例。 外部类型属于操作系统或 Framework 组件,或者由编译器生成。

快照详细信息报告

可以使用快照详细信息报告专注于诊断会话中的某个快照。 若要打开详细信息报告,可在快照视图中选择一个链接,如下图所示。 这两个链接都可打开相同的报告;唯一的差异是在报告中启动**“托管堆”**树的排序顺序不同。 在这两种情况下,你可以在报告打开后更改排序顺序。

指向快照视图中快照报表的链接

  • **“MB”链接按“非独占大小(以字节为单位)”**列对报告进行排序。

  • **“对象”链接按“计数”**列对报告进行排序。

托管堆树(快照详细信息)

**“托管堆”树列出了保存在内存中的对象类型。 你可以展开类型名称以查看十大类型示例(按大小排列)。 通过选择类型或实例,可以显示选定项的“根路径”“引用对象”**树。

托管堆树

对象类型

类型或对象实例的名称。

计数

类型的对象实例数。 对于实例,该数量始终为 1。

大小(以字节为单位)

对于类型,则为内存快照中所有类型实例的大小,排除实例中包含的对象的大小。

对于实例、类型,则为对象的大小,排除实例中包含的对象大小。 实例。

非独占大小(以字节为单位)

类型实例的大小或单个实例的大小,其中包括所含对象的大小。

根路径树(快照详细信息)

**“根路径树”**显示引用类型或实例的对象链。 .NET Framework 垃圾回收器仅在释放对某个对象的所有引用后清理该对象的内存。

类型的根树的路径

当你在**“根路径”树中查看某个类型时,将在“引用计数”**列中显示保留对该类型引用的类型对象的数量。 当你分析实例时,该列不会显示。

引用对象树(快照详细信息)

**“引用对象”**树显示已选定类型的对象或实例引用的对象。

引用的实例对象树

对象类型/实例

类型或对象实例的名称。

大小(以字节为单位)

对于类型,则为所有类型实例的大小,排除类型中包含的对象的大小。

对于实例,则为对象的大小,排除实例中包含的对象大小。

非独占大小(以字节为单位)

类型实例的总大小或实例的大小,其中包括所包含的对象的大小。

快照差异报告

快照差异报告显示主要快照和紧接着在它之前拍摄的快照之间的更改。 若要打开差异报告,可在快照视图中选择一个链接,如下图所示。 这两个链接都可打开相同的报告;唯一的差异是在报告中启动**“托管堆”**树的排序顺序不同。 你可以在报告打开后更改排序顺序。

指向快照视图中差异报表的链接

  • **“MB”链接按“非独占大小(以字节为单位)”**列对报告进行排序。

  • **“对象”链接按“计数”**列对报告进行排序。

托管堆树(快照差异)

**“托管堆”树列出了保存在内存中的对象类型。 你可以展开类型名称以查看十大类型示例(按大小排列)。 通过选择类型或实例,可以显示选定项的“根路径”“引用对象”**树。

差异报表中类型的托管堆树

请注意,在该图片中,“计数”、**“大小(以字节为单位)”以及“非独占大小(以字节为单位)”**列已折叠。

对象类型

类型或对象实例的名称。

计数

主要快照中的类型实例的数量。 对于实例,“计数”始终为 1。

计数差异

对于类型,则为主要快照与上一个快照之间的类型实例数的差异。 对于实例,字段是空白的。

大小(以字节为单位)

主要快照中对象的大小,排除对象中包含的对象的大小。 对于类型,“大小(以字节为单位)”“非独占大小(以字节为单位)”为类型实例的总大小。

总大小差异(以字节为单位)

对于类型,则为主要快照和上一个快照之间的类型实例总大小的差异,排除实例中包含的对象的大小。 对于实例,字段是空白的。

非独占大小(以字节为单位)

主要快照中对象的大小,其中包括对象中包含的对象的大小。

非独占大小差异(以字节为单位)

对于类型,则为主要快照和上一个快照之间的所有类型实例大小的差异,其中包括对象中包含的对象的大小。 对于实例,字段是空白的。

根路径树(快照差异)

**“根路径树”**显示引用类型或实例的对象链。 .NET Framework 垃圾回收器仅在释放对某个对象的所有引用后清理该对象的内存。

在差异视图中实例的根树的路径

引用对象树(快照差异)

**“引用对象”**树显示主要类型的对象或实例引用的对象。

引用的实例对象树

对象类型/实例

类型或对象实例的名称。

大小(以字节为单位)

对于实例,则为主要快照中的对象大小,排除该实例中包含的对象大小。

对于类型,则为主要快照中类型实例的总大小,排除实例中包含的对象的大小。

非独占大小(以字节为单位)

主要快照中对象的大小,其中包括对象中包含的对象的大小。

请参见

概念

分析内存使用情况 (JavaScript)

使用 Visual Studio 诊断工具来分析 Windows 应用商店应用程序的性能

从“性能和诊断”页运行分析工具

其他资源

使用 C++、C# 和 Visual Basic 的 Windows 应用商店应用的性能最佳做法