我们运行了一个.Net网站,它使用了极大的私有字节数:4,45 GBytes及以上。 这发生在多个Web服务器上,但似乎没有模式。
借助其他一些答案,当然还有the blog of Tess Ferrandez,我们已经使用DebugDiag和WinDbg(Win8 SDK的一部分)获得了大量信息:
我们知道只有一个分配消耗超过3 GBytes:
我们知道它的本机记忆:
我们知道它是在堆1上分配的:
从这里开始我们被困住了。 建议的命令(!heap -stat -h,!heap -flt s和!heap -p -a)(也可以找到here)不会向我们提供有关此行为原因的信息。< / p>
有没有人见过这个?是否有其他方法或命令可以查看是什么导致nativerd(IIS的本机代码配置读取器)疯狂?
答案 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报告的该部分显示了什么? 另外,你怎么知道这是一个单一的分配?