C# List<T> 内存不足异常但远离 2Gb 限制

C# List<T> out of memory exception but far away from the 2Gb limit

我有一个 List<Matrix4>,其中 Matrix4 是一个包含 16 个浮点数的结构,因此它使用 16 * 4 字节 = 64 字节。

当我开始向列表中添加项目时,当我超过 100 万行时它会抛出内存不足异常。

我知道 .NET 对每个对象有 2Gb 的限制,但除非我完全疯了:

1.000.000 * 64 字节 = ~61mb

这甚至还没有接近极限。

当我开始填充列表时,根据任务管理器,我的应用程序正在使用 896mb,当我遇到异常时它正在使用 1028mb。

计算机有 8GB 的​​物理内存,但它只使用了 6Gb。

关于为什么会发生的任何线索?

---更新----

将平台目标更改为 x64 解决了单独测试项目中的问题。不幸的是,原始项目不能是 x64,因为引用了不能在 x64 上运行的 x86 DLL。但这是另一个问题。

我没有考虑将其更改为 x64,因为它似乎远离内存限制,但我猜 Hans Passant 是正确的,122mb 距离 1.3Gb 限制太近了。谢谢大家

大型结构是在大型对象堆 (LOH) 上完成的,并且容易产生碎片。

因此,虽然您可能有足够的空闲内存,但您可能没有足够大的 1 个剩余内存块。

您的数字 (1M x 64) 本身不够,只有进行足够的其他分配才能解释问题。您可以尝试解决这个特定问题,但这可能只是一个更大的问题变得可见的地方。

一般来说,TaskManager 不是诊断内存问题的正确工具。你需要一个内存分析器来找出发生了什么。

这还取决于您的平台版本以及它是 32 位还是 64 位。