我正在用C#编写一个分析应用程序,它必须处理大量内存。我使用ANTS Memory Profiler 7.4来优化我的内存管理。在这样做的时候,我意识到我使用的所有双[,]数组(我需要它们)都放在LOH上,尽管这些数组中最大的是大约24.000字节。据我所知,对象不应该放在85.000字节之前。问题是现在,因为我有大约几千个这些双[,]数组的实例,我有很多内存碎片(我的总内存使用量的约25%是我无法使用的可用内存)。存储在LOH上的这些数组中的一些甚至只有1.036字节。问题是,有时我必须执行更大的分析,然后由于LOH碎片导致大量内存丢失,最终导致内存不足。
有人知道为什么会发生这种情况虽然根据定义它不应该是一个大对象吗?
答案 0 :(得分:4)
在LOH上放置双打数组的阈值大小远低于其他类型。这样做的原因是LOH上的项始终是64位对齐的,并且通过64位对齐可以大大加倍。
请注意,这仅影响以32位运行的程序。以64位运行的程序具有始终在64位边界上对齐的对象,因此LOH启发式不用于64位程序。
阈值大小为1000倍。
另见https://connect.microsoft.com/VisualStudio/feedback/details/266330/