1

我正在对使用 .net 4.5 Asp.net + Unity 3.0.1304.1 + Nhibernate 3.3.1.4 编写的应用程序进行故障排除,该应用程序的内存消耗达到 3 到 5 GB,高于预期。

在收集了一些内存转储后,很明显大对象堆上有碎片。

我的第一个想法是将应用程序更新到 .net 4.5.1 并告诉 GC 压缩 LOH,但我注意到固定对象数组的数量,这导致了一个演示应用程序可以得出结论,堆压缩不是在固定对象场景中很有帮助,并且在没有固定对象时甚至没有必要,因为没有碎片。

所以我试图跟踪这个固定的对象并遇到了这个问题,据说静态成员负责那些固定的对象并且句柄位于高频堆上。

我的问题是:

  • 我该如何继续尝试解决碎片问题?
  • 由于我从 WinDbg 知道的命令不起作用,如何获得有关高频堆的更多信息?

以上来自windbg的一些打印:

4

1 回答 1

1

我最近解决了这个问题中解释的类似问题:Large unexplained memory in the memory dump of a .NET process。固定对象不在高频堆中,但与异步套接字 API 相关。请注意,这些对象byte[]可能不是您的情况。

我不认为高频堆中的固定对象会导致碎片。因为它是一个单独的堆。无论如何,您的对象都在 LOH 上。

因此,首先,您需要确定是什么创建(和固定)这些对象。可悲的是我不知道一个简单的方法。您应该尝试识别创建或固定这些对象的代码。在我的案例中,我发现的唯一方法是分别运行代码的不同部分并为每个部分创建一个转储......我在某些时候很幸运。也许你可以看看pinning 的样子。但它可能发生在 CLR 的低级别部分。

于 2018-11-23T09:20:47.460 回答