如何读取 Visual Studio 中的内存快照

How to read the memory snapshot in Visual Studio

我使用 Visual Studio 拍摄我的应用程序的内存快照。

我对理解我得到的数据有一些疑问。 在捕获内存快照后,我过滤掉了我的 class 之一,比如 MyClassPanel。我只在我的 xmal 文件中使用 MyClassPanel。

  1. 为什么 MyClassPanel 的“Paths to Root”都是“MyClassPanel [RefCount Handle, Count:1]”? (即相同的名称但带有字符串 [末尾的 RefCount Handle] 和不同的计数值)这是什么意思?在其他 class 中,我过滤,我看到 'Paths to Root' 是不同的 class 名称。

  2. 我有 24 个 MyClassPanel(来自顶部 table 的计数)。在底部的“引用计数”列中 table,当我将它们相加时,它们是 24。

总是这样吗?我认为“计数”和“引用计数”的含义不同。在这种情况下,它们加起来。这有意义吗?

  1. Paths to Root 视图显示了对该类型的引用,防止它被垃圾回收。由于您的 class 是一个 Xaml 页面,因此使 class 保持活动状态的引用是 Xaml 页面的 CLR 处理程序。这些显示为 RefCount Handle。

  2. 计数和引用计数确实不一样。 Count是实例数,reference count是引用数。因为您案例中的每个实例只有一个参考,所以它们加起来是有意义的。

更多信息:

我不是 Visual Studio 快照分析器的忠实粉丝。如果在拍摄快照之前未正确执行最终确定,则会出现相当多的并发症。我不确定 Visual Studio 是如何处理的。但是,您提供的快照对我来说也没有多大意义。

我建议您下载 ANTS 内存分析器并进行调查。它有一个合理的试用期。通过使用它,您将能够通过使用它的 'Retention Graph' 查看对每个实例的所有引用。它将专门向您展示哪些实例保留了对您的对象的引用,还将向您展示哪些对象已实现 Dispose 但尚未调用。我想,它会提供更多的支持来找到这个问题的根本原因。

查看下面的页面演练

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/walkthrough http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/