3

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

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

  • 我们知道只有一个分配消耗超过 3 GB: 在此处输入图像描述

  • 我们知道它是本机内存: 在此处输入图像描述

  • 我们知道它分配在堆 1 上: 在此处输入图像描述

从这里开始,我们被困住了。建议的命令(!heap -stat -h、!heap -flt s 和 !heap -p -a)也可以在此处找到,但并未向我们提供有关此行为原因的信息。

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

4

3 回答 3

0

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

于 2012-11-05T08:21:35.050 回答
0

在 windbg 中加载 sos dll。

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

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

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

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

更新:

对于本机内存泄漏,请在代码库中使用_CrtDumpMemoryLeaks 。如果您使用的是 Visual Studio,则泄漏内存的块将显示在输出窗口中

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

于 2012-11-01T14:48:32.733 回答
0

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

于 2012-11-18T12:00:12.943 回答