大对象堆碎片,数组问题

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

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

使用ANTS Memory Profiler的应用程序的Memroy快照

小的双数组也受到这个影响(数组中只有70个元素)


将LOH阵列放在LOH上的阈值大小远低于其他类型。 其原因是LOH上的项目总是64位对齐,并且64位对齐会使双倍受益。

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

阈值大小是1000倍。

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

链接地址: http://www.djcxy.com/p/62361.html

上一篇: Large Object Heap Fragmentation, Issues with arrays

下一篇: Can I get a handle to