9

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

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

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

小型双精度数组也受此影响(数组中只有 70 个元素)

4

1 回答 1

4

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

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

阈值大小为 1000 双倍。

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

于 2012-08-03T09:06:22.450 回答