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

RBa*_*iak 6 .net c# out-of-memory

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

当我开始向列表添加项目时,当我跨越100万行时,它会抛出Out Of Memory Exception.

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

1.000.000*64字节= ~61mb

哪个甚至没有接近极限.

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

这台电脑有8GB的物理内存,但它只使用6Gb.

有关原因的任何线索可能会发生吗?

---更新----

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

我没有考虑将它改为x64,因为它似乎远离内存限制,但我认为Hans Passant在120mb上距离1.3Gb限制太近了.谢谢你们.

Hen*_*man 11

在大对象堆(LOH)上进行大型结构,并且可能会出现碎片.

因此,虽然你可能有足够的可用内存,但你可能没有足够大的内存块.

你自己的数字(1M x 64)是不够的,只有足够的其他分配才能解释这个问题.您可以尝试解决此特定问题,但这可能只是更大问题变得可见的问题.

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

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

  • @Asad不,问题是不断重新创建`List`的支持数组,并在添加新项目时复制项目以增加其大小.这些许多大型数组的创建正在破坏内存. (2认同)