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 位。
我有一个 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 位。