【问题标题】:Fragmentation on .NET LOH due to pinned objects由于固定对象,.NET LOH 上的碎片
【发布时间】:2018-09-17 15:34:14
【问题描述】:

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

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

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

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

我的问题是:

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

以上来自windbg的一些印刷品:

【问题讨论】:

标签: .net large-object-heap heap-fragmentation


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2010-10-16
    • 1970-01-01
    • 2010-10-15
    • 2020-08-12
    • 1970-01-01
    • 2011-03-07
    • 2011-12-22
    • 2012-08-01
    相关资源
    最近更新 更多