大对象堆碎片,数组问题

Oli*_*rdt 8 c# memory-management out-of-memory large-object-heap

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

有没有人知道为什么会发生这种情况虽然根据定义它不应该是一个大对象?

使用ANTS Memory Profiler记录我的应用程序的快照

小双排列也受此影响(数组中只有70个元素)

Mat*_*son 4

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

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

阈值大小为 1000 个双倍。

另请参阅https://connect.microsoft.com/VisualStudio/feedback/details/266330/

  • 多维双精度数组在 .NET Framework 4.6 中遵循相同的规则。`Console.WriteLine(GC.GetGeneration(new double[31,31]));` 输出 0,`Console.WriteLine(GC.GetGeneration(new double[32,32]));` 输出 2。 (2认同)