Visual Studio内存快照

时间:2015-07-22 16:19:40

标签: visual-studio

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

如何找到创建这些节点的位置,因为它们来自mscorlib.ni.dll。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

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

您会看到一个不透明的Node<T>对象。只需将其键入搜索框,弹出弹出窗口,但使用它的几种类型。大多数都在System.Collections.Concurrent命名空间中。嗯,不要再看了,剖析器已经告诉过你那个。显然,System.Collections.Concurrent命名空间中的Stack<T>类存储节点

您的探查器告诉您只有一个 Stack&lt;&gt;拥有这些对象的类对象。好吧,它将它缩小到只有单个对象。它碰巧有208个元素。嗯,好吧,不是那么多,是吗?

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

啊,很好,这也是一个很短的清单。你看到System.Data.ProviderBase多次显示,嗯,这个问题可能与查询dbases无关。只有其他参考文集是System.PinnableBufferCache

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

长话短说,你找到this guy's project。程序员注意到,并非经常发生。

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

你绝对是完成。祝贺。