【问题标题】:Source of Node<Object> in the Visual Studio memory snapshotVisual Studio 内存快照中 Node<Object> 的来源
【发布时间】:2015-07-28 08:00:33
【问题描述】:

我正在使用 Visual Studio 诊断工具为我的应用程序进行内存分析。我发现 Node 占用了大量内存(基于 Inclusive Size Diff。(字节)。(见下文#1)。当我单击 Node 的第一个实例“引用对象”时,我看到 Node 是引用其他节点。我在属性中看到类似“重叠数据”的内容。

如何从 mscorlib.ni.dll 中找出创建这些节点的位置。

【问题讨论】:

    标签: visual-studio


    【解决方案1】:

    当您通过这些 .NET Framework 对象进行 root 时,首选的武器是一个很好的反编译器。我用 Reflector,还有其他的。

    您会看到一个不透明的Node&lt;T&gt; 对象返回。只需将它输入到搜索框中,弹出但有几种类型使用它。大多数都在 System.Collections.Concurrent 命名空间中。好吧,别再看了,分析器已经告诉过你了。显然,System.Collections.Concurrent 命名空间中的Stack&lt;T&gt; 类存储了节点

    您的分析器告诉您只有 一个 Stack 类对象拥有这些对象。很好,这将其缩小到只是一个 single 对象。它恰好有 208 个元素。嗯,嗯,没那么多吧?


    这不是你必须停止的地方,Stack 类是一个非常无用的类,没有人真正在他们的代码中使用它。继续使用反编译器,让它搜索那个类的用法。

    啊,很好,这也是一个非常简短的列表。您会看到 System.Data.ProviderBase 多次出现,嗯,这个问题可能与查询数据库无关。只有其他引用集是System.PinnableBufferCache

    “可固定缓冲区”,哇,这是一个匹配项。当您要求本机代码完成填充托管数组的工作时,固定缓冲区很重要。使用BeginRead(),通用异步 I/O 调用。驱动程序在处理异步 I/O 请求时需要对数组的稳定引用。获得稳定的缓冲区需要固定在 .NET 中。以及分析器数据中的大宾果游戏,您会看到 OverlappedData,Windows 中的 core data-structure 执行异步 I/O。


    长话短说,你找到了this guy's project。程序员注意到了,但并不经常。


    了解何时停止分析非常重要。您不能更改其他程序员编写的代码。微软没有人认为那个人做错了什么。他没有,缓存是好东西。

    你绝对完成。恭喜。

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多