分析内存分配
使用 内存分配 视图分析特定时间间隔内的分配:了解在此间隔内分配了哪些对象以及哪些函数分配了这些对象。 即使在分析仍在进行时,该视图也可以显示分配数据:不需要内存快照。
数据收集模式
dotMemory 可以以两种模式之一收集内存分配数据:
- 采样
(默认,仅限 Windows)dotMemory 收集有限的分配数据:对于每个分配对象的函数,您只能查看大致的对象大小。 无法获取对象数量的信息。
采样 模式的优点:
它不会减慢被分析的应用程序。
当分析器附加到已运行的应用程序时,您可以使用它。
数据不详细,因为它基于 ETW 事件:每当分配的内存总大小超过 100KB 时,就会触发分配事件。 例如,在分析期间,一个线程分配了五个 50 KB 的内存块。 在这种情况下,dotMemory 只会检测到两个 100 KB 的分配。

- 完整
dotMemory 收集详细的分配数据:包括分配对象的确切大小和对象数量。
完整 模式的缺点:
它会显著减慢被分析的应用程序。
当分析器附加到已运行的应用程序时,您无法使用它。
在分析会话期间,您可以随时在这些模式之间切换。 请注意,如果您想分析完整的分配数据,则必须在所需的时间范围内启用 完整 数据收集模式。 如果此范围包含 采样 数据的时间间隔, 内存分配 视图将仅显示采样的分配数据。

如何获取内存分配数据
在任意时间间隔内分析内存分配

分析从会话开始到特定快照之间的内存分配

分析两个快照之间的内存分配

类型

对象列表
列表显示了在所选时间间隔内分配的对象,并按对象类型分组。 选择特定类型以查看分配此类型对象的函数。
名称 | 描述 |
|---|---|
类型 | 类型名称. |
对象 | 相同类型对象的数量。 |
字节 | 对象的总体浅表大小(以字节为单位)。 |
反向跟踪
回溯树显示了当前在对象列表中选定的对象的所有分配调用树。 调用从下往上显示:调用堆栈中的最后一个调用是顶部节点。 换句话说,回溯是反转的调用树。
您可以按分配的内存量(总计 / 自有字节 )或分配的对象数量(总计 / 自有对象 )对树进行排序。 要切换排序,请点击 总计 / 自有 ... 列标题。
总计 / 自有 ... 列显示了在特定调用树(总计 )或特定调用(自有 )中分配了多少内存(对象)。
例如:

set_Capacity 方法分配了 149.80 MB(自有)。 该方法从两个调用堆栈中被调用:
通过
AddWithResize方法:142.69 MB以及通过
EnsureCapacity方法:7.11 MB
要查看在 调用树 中调用特定方法的位置,请右键点击该方法并选择 在“调用树”中显示此方法的出现位置。 这将显示包含所有方法调用合并的调用树。
方法

方法 视图由三部分组成: 方法列表、 回溯树 和前五种分配对象类型的旭日图。
方法列表
列表显示了在所选时间间隔内调用的方法。 选择特定方法以查看该方法分配的对象类型以及该方法的回溯树。 请注意,列表中的每个方法都是唯一的——它表示从所有调用堆栈中对该方法的所有调用。
名称 | 描述 |
|---|---|
方法 | 方法名称. |
对象 | 通过方法调用分配的对象数量。 |
字节 | 对象的总体浅表大小(以字节为单位)。 |
反向跟踪
回溯树显示了当前在方法列表中选定的方法的所有调用堆栈。 调用从下往上显示:调用堆栈中的最后一个调用是顶部节点。 换句话说,回溯是反转的调用树。
回溯树类似于 类型 视图中的回溯树。
调用树

调用树 视图显示了所选时间间隔的调用树。 如果调用分配了对象,则对象类型将在调用下方的树中显示。
总计 / 自有 ... 列显示了在特定调用树(总计 )或特定调用(自有 )中分配了多少内存(对象)。
您可以按分配的内存量(总计 / 自有字节 )或分配的对象数量(总计 / 自有对象 )对树进行排序。 要切换排序,请点击 总计 / 自有 ... 列标题。
要筛选调用树,请在 筛选器 字段中开始输入。 了解更多关于如何设置筛选器的信息
要查看特定方法的子系统,请右键点击该方法并选择 显示此方法的子系统。
子系统

子系统将所有属于特定类型、命名空间或程序集的方法分组。 要切换分组类型,请使用表格顶部的 类型、 命名空间 和 汇编 按钮。 使用 子系统 视图快速了解特定应用程序组件分配了多少内存。 例如,此视图对于评估您新添加或重构代码的内存分配特别有用。
每个子系统包括其整个调用子树(总计 大小)创建的所有对象。 例如,在控制台应用程序中,类型 Program 的子系统将包括应用程序创建的所有对象,因为 Program.Main() 是应用程序调用树中的顶级节点。
子系统 是一个主从视图。 在左侧表格中选择一个子系统,右侧您将看到:
由所选子系统的实例分配的前五种类型。
所选子系统分配内存最多的前五种方法。
所选子系统的合并调用树。
如果调用分配了对象,则对象类型将在调用下方的树中显示。
总计 / 自有 ... 列显示了在特定调用树(总计 )或特定调用(自有 )中分配了多少内存(对象)。
您可以按分配的内存量(总计 / 自有字节 )或分配的对象数量(总计 / 自有对象 )对树进行排序。 要切换排序,请点击 总计 / 自有 ... 列标题。
要查看特定方法在应用程序调用树中的位置,请右键点击该方法并选择 在“调用树”中显示此方法。
从范围中排除子系统
一个应用程序包含许多对进一步分析无意义的子系统。 例如,很明显, System.Windows.Application 类型的子系统将包括分析会话期间进行的所有调用,因为应用程序是由 Application.Run() 方法启动的。 在这种情况下,您可以排除不想分析的子系统。
将子系统从分析中排除
在列表中选择一个子系统。
按 Del 或右键点击子系统并在上下文菜单中选择 从范围中排除。
dotMemory 会将排除的子系统变灰并将其放到子系统列表的末尾。
将排除的子系统恢复
滚动到子系统列表的末尾。
选择排除的子系统。
按 Del 或右键点击子系统并在上下文菜单中选择 返回范围。


