支配者
此 支配者 视图帮助您了解应用程序中内存的保留方式。 例如,您知道字符串在应用程序的内存中占据了很大一部分。 然而,很可能,您的优化目标并不是这些字符串本身,而是存储它们的数据结构。 此 支配者 视图回答了“谁保留了内存”这一问题,这在分析低效的内存使用时非常重要。 为了正确回答这个问题,您需要熟悉 支配者 的概念。
什么是支配者?
Object A dominates object B if every path to B from the app's roots goes through A. 换句话说,对象 B 仅由对象 A 独占保留:如果 A 被垃圾回收,那么 B 也会被垃圾回收。 例如,数组是其元素的支配者(如果没有其他对数组元素的引用)。

如果从应用程序的根到一个对象有多条路径,则该对象被认为是非支配的或 非独占保留 的对象。 例如,如果对象 C 被对象 A 和 B 保留,而 A 被垃圾回收, C 将仍然保留在内存中(因为它仍然被 B 引用)。 这就是为什么理解支配路径和保留路径之间的区别很重要:
支配路径——路径上的对象仅由另一个对象保留。
保留路径——路径上的对象可能被任意数量的其他对象保留。
此 支配者 视图由两部分组成:
支配者树
右侧的树显示了所选对象集的 支配者 树。
树可以在两种模式下工作,这些模式可以通过树头中的相应按钮选择:
树 :显示所有支配者节点。 参与所选树节点支配路径的支配者以 加粗 显示。
路径 :仅显示参与所选树节点支配路径的支配者。
支配者列表包含以下列:
名称 | 描述 |
|---|---|
类型 | 类型名称. 类型名称左侧的数字显示以这种方式保留的该类型对象的数量。 例如,某些整数数组 A 的元素以完全相同的方式保留(A -> 元素),但整数数组 B 的元素有另一条保留路径(B -> 元素)。 |
保留字节 | 独占保留对象的总大小(以字节为单位)。 |
保留的对象 | 被支配者支配的对象数量。 |
图表可视化
左侧的旭日图是支配者树的图形表示。 支配者保留的内存越多,中心角度越大。
对支配者树的分析可能相当复杂,因为您需要展开其节点并解释 保留的字节数 列中的数字。 相比之下,快速查看旭日图可以让您确定应用程序中的主要支配者和最大的结构。 单击您感兴趣的支配者,将在树中显示其支配路径。
请参考下面的 示例 ,以更好地理解旭日图如何显示支配者树中的数据。
缩放
如果您想更详细地查看某个支配者子树,可以更改图表的缩放比例。
放大支配者
请执行以下操作之一:
双击图表中的相应弧线。
双击树中的支配者,或选择树并按 Enter 键。
该支配者将成为图表的根节点。
缩小回到原视图
单击图表的中心。
示例

筛选对象
您可以通过类型筛选掉对分析无关的对象。
缩小列表范围
开始输入所需的字符串模式。 JetBrains Rider 将高亮显示匹配的字符串。
您可以通过以下提示使搜索更高效:
使用 CamelHumps。 例如,
fo将返回System.Drawing.Font和MS.Utility.FrugalObjectList类型的对象。使用 特殊符号 ,例如通配符和其他符号。 完整列表显示在下表中。
- 特殊符号和筛选示例
Symbol
描述
示例
*通配符
*
集合中的所有对象sys.*.data
所有匹配模式的类型和命名空间。 例如,System.Data、System.Windows.Controls.Datagrid和System.Windows.Data.Binding。sys.*.data.
仅匹配模式的命名空间。 例如System.Windows.Data.Binding,但 不是System.Windows.Controls.Datagrid。数组
[]仅保留数组
str[]
包含str的类型或命名空间中的数组。 例如字符串[]。[,][,,...
或[,][,,]...仅保留指定维度或更高维度(如果括号未闭合)的数组
str[,,
包含str的类型或命名空间中维度为 3 或更高的数组。 例如字符串[,,]和字符串[,,,]。str[,,]
包含str的类型或命名空间中的三维数组。 例如字符串[,,]。!a从结果中排除数组
!a str
包含str的类型或命名空间中(不包括数组)的对象。 例如字符串,但 不是字符串[]。泛型类型参数
<仅保留具有泛型类型参数的类型
str<
仅包含str的类型或命名空间并具有泛型类型参数的对象。 例如FileStreamStorage<Char>,但 不是List<String>。<str
仅包含str的泛型类型参数中的对象。 例如List<String>,但 不是FileStreamStorage<Char>。<,<,,...
或<,><,,>...仅保留具有指定数量泛型类型参数的对象
fun<,,>
包含有趣吗的类型或命名空间并具有三个泛型类型参数的对象。 例如Func<String, Object, Object>。fun<str,,task
包含有趣吗的类型或命名空间并具有三个或匹配模式的泛型类型参数的对象。 例如Func<Stream, IAsyncResult, TaskResult, EventArgs>。!g从搜索范围中排除泛型类型参数
!g str
包含str的类型或命名空间中(不具有泛型类型参数)的对象。 例如字符串,但 不是List<String>。#c#结构体#m#ns按类型、值类型、方法或命名空间搜索。
#ns 功能
包含功能的命名空间中的对象。
选择对象以进行进一步分析
在 支配者 视图中,您可以选择以下主题进行进一步分析:
打开由特定支配者保留的对象
请执行以下操作之一:
按住 Alt 并单击树或图表中的支配者。
右键单击支配者,并在上下文菜单中选择 打开通过此支配路径保留的对象。
之后, 通过 [type_name] 保留的对象 主题将被添加到左侧的分析路径中,并且所需对象的列表将显示在 按类型分组 视图中。
打开支配者对象集
请执行以下操作之一:
按住 Shift 并单击树或图表中的支配者。
右键单击支配者,并在上下文菜单中选择 打开此对象集。
之后, [type_name] 的支配者 主题将被添加到左侧的分析路径中,并且所需对象的列表将显示在 按类型分组 视图中。
选择仅由已分析对象集独占保留的对象
点击
由此集合保留的未关闭对象 按钮。之后, 独占保留的对象 主题将被添加到左侧的分析路径中,并且所需对象的列表将显示在 按类型分组 视图中。