我正在使用Visual Studio诊断工具为我的应用程序进行内存分析。我发现Node占用了大量内存(基于Inclusive Size Diff。(字节)。(见下面的#1)。当我点击Node的第一个实例'Referenced Objects'时,我看到Node是引用其他节点。我在属性中看到类似“重叠数据”的内容。
如何找到创建这些节点的位置,因为它们来自mscorlib.ni.dll。
答案 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。程序员注意到,并非经常发生。
了解停止分析的时间非常重要。您无法更改其他程序员编写的代码。微软没有人认为那个人做错了什么。他没有,缓存是好事。
你绝对是完成。祝贺。