【问题标题】:How to read the memory snapshot in Visual Studio如何在 Visual Studio 中读取内存快照
【发布时间】:2015-08-20 19:26:13
【问题描述】:

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

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

  1. 为什么 MyClassPanel 的“根路径”都是“MyClassPanel [RefCount Handle, Count:1]”? (即相同的名称,但末尾有一个字符串 [RefCount Handle] 和不同的 Count 值)这是什么意思?在其他类中,我过滤,我看到“根路径”是不同的类名。

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

总是这样吗?我认为“计数”和“参考计数”意味着不同的东西。在这种情况下,它们加起来。这有意义吗?

【问题讨论】:

  • 我发现 Redgate 内存分析器更有助于跟踪内存问题,因为它会显示实例保留图。

标签: c# visual-studio memory-leaks


【解决方案1】:
  1. Paths to Root 视图显示了对该类型的引用,以防止它被垃圾收集。由于您的类是 Xaml 页面,因此保持该类活动的引用是 Xaml 页面的 CLR 处理程序。这些显示为 RefCount 句柄。

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

更多信息:

【讨论】:

  • 感谢您的回答。对于 #1,每个面板是否由其自己的 CLR 处理程序保持活动状态?或 1 个 CLR 处理程序使所有面板保持活动状态。 Ref Count句柄中的'Count'是什么意思?
  • 我发布了我的内存配置文件的屏幕截图。我有个问题。对于#2,为什么您说“因为您的案例中的每个实例只有一个引用,所以它们加起来是有道理的。”?我的 [Ref Count Handle,Count: 1] 不是有 8 个“MyClass Panel”引用,而 [Ref Count Handle, Count:16] 不是有 6 个“MyClass Panel”引用吗?
  • Ref Count句柄中'Count'的含义,是com对象(en.wikipedia.org/wiki/Reference_counting)的引用计数。取决于页面是否被加载和引用,它保持活动状态
【解决方案2】:

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

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

看看下面的页面演练

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 2012-09-10
    • 2018-02-20
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多