分析.Net应用程序中的极端私有字节使用情况,本机内存泄漏?

时间:2012-11-01 10:15:05

标签: .net memory-management memory-leaks windbg unmanaged-memory

我们运行了一个.Net网站,它使用了极大的私有字节数:4,45 GBytes及以上。 这发生在多个Web服务器上,但似乎没有模式。

借助其他一些答案,当然还有the blog of Tess Ferrandez,我们已经使用DebugDiag和WinDbg(Win8 SDK的一部分)获得了大量信息:

  • 我们知道只有一个分配消耗超过3 GBytes: enter image description here

  • 我们知道它的本机记忆: enter image description here

  • 我们知道它是在堆1上分配的: enter image description here

从这里开始我们被困住了。 建议的命令(!heap -stat -h,!heap -flt s和!heap -p -a)(也可以找到here)不会向我们提供有关此行为原因的信息。< / p>

有没有人见过这个?是否有其他方法或命令可以查看是什么导致nativerd(IIS的本机代码配置读取器)疯狂?

3 个答案:

答案 0 :(得分:0)

在windbg中加载sos dll。

在windbg中尝试!dumpheap -stat。这将返回堆中的所有对象。

遍历堆并查看创建的对象数量更多,并分析该对象是否仍需要存储在内存中,或者应该长时间回收垃圾。

收集这些对象并执行!gcroot,您将能够看到哪个父对象让您的对象收集垃圾。这将帮助您缩小内存泄漏范围。

最常见的内存泄漏是由于在.net中使用事件而发生的。 A级会订阅B级赛事。除非B类是垃圾收集,否则对象A仍将驻留在内存中。

<强>更新

对于本机内存泄漏,请在代码库中使用_CrtDumpMemoryLeaks。如果您使用visual studio

,则会在输出窗口中显示泄漏内存的块

Glowcode还允许您检测本机内存泄漏。

答案 1 :(得分:0)

由于它有一个巨大的分配,你可以使用Windbg设置一个中断并检查调用堆栈。请参阅我的回答here,了解如何设置这样的休息时间。注意这是32位,你必须将其调整为64位。

答案 2 :(得分:0)

我是DebugDiag noob,但我认为下一步应该是查看DebugDiag在模块报告中提供的调用堆栈示例,以查看导致这些分配的原因。从截图中看,您似乎已经点击了有问题的功能。 DebugDiag报告的该部分显示了什么? 另外,你怎么知道这是一个单一的分配?