【问题标题】:Large Object Heap Fragmentation, Issues with arrays大对象堆碎片,数组问题
【发布时间】:2012-08-01 05:25:02
【问题描述】:

我正在用 C# 编写一个分析应用程序,它必须处理大量内存。我使用 ANTS Memory Profiler 7.4 来优化我的内存管理。这样做时,我意识到我使用的所有 double[,] 数组(并且我需要它们)都放在 LOH 上,尽管这些数组中最大的大约是 24.000 字节。据我所知,对象不应该放在 85.000 字节之前。现在的问题是,由于我有大约数千个这些 double[,] 数组的实例,我有很多内存碎片(我的总内存使用量中约有 25% 是我无法使用的空闲内存)。其中一些存储在 LOH 上的数组甚至只有 1.036 字节大小。问题是,有时我必须执行更大规模的分析,然后由于 LOH 碎片导致大量内存丢失,最终导致内存不足异常。

有谁知道为什么会发生这种情况,尽管根据定义它不应该是一个大对象?

【问题讨论】:

  • 看看this answer
  • 我看到了,但首先我在这里不使用字符串,而且关于双数组的答案也不适合我的问题,因为我在 LOH 上的许多双 [,] 数组甚至没有 6项目。所以这真的让我一无所知。但感谢您的回答。我之前已经看过那个帖子,但它并没有完全解决我的问题。

标签: c# memory-management out-of-memory large-object-heap


【解决方案1】:

在 LOH 上放置双精度数组的阈值大小远低于其他类型。原因是 LOH 上的项目始终是 64 位对齐的,并且双倍从 64 位对齐中受益匪浅。

请注意,这只影响以 32 位运行的程序。以 64 位运行的程序具有始终在 64 位边界上对齐的对象,因此 LOH 启发式不适用于 64 位程序。

阈值大小为 1000 双倍。

另见https://connect.microsoft.com/VisualStudio/feedback/details/266330/

【讨论】:

  • 正如我所说,它也会影响只有 6 个条目大小的 double[,] 数组。所以 LOH 上的数组是一个 double[2,3] 数组,但我仍然在 LOH 上(所有其他的 double[,] 数组也更大)。但是我的大多数数组(大约 90%)都没有超过 1000 双打阈值。好的,我在屏幕截图中显示的那些超出了这个限制,但大多数都没有。他们呢?为什么他们最终会在那里?
  • 即使在一个只分配一个数组的简单程序中也会发生这种情况吗?想知道是否有什么奇怪的东西触发了这种行为。
  • 是的...似乎 double [,] (多维)类型的数组总是放在 LOH 上,而不管它们的大小。任何人都知道如何防止这种情况?因为我经常使用它们,我不想完全重新设计整个项目。
  • 多维双精度数组遵循 .NET Framework 4.6 中的相同规则。 Console.WriteLine(GC.GetGeneration(new double[31,31])); 输出 0 和 Console.WriteLine(GC.GetGeneration(new double[32,32])); 输出 2。
猜你喜欢
  • 2010-10-15
  • 2011-12-22
  • 1970-01-01
  • 2011-11-14
  • 2011-07-12
  • 2014-07-14
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多