我有一个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限制太近了.谢谢你们.
解决方法
在大对象堆(LOH)上进行大型结构,并且可能会出现碎片.
因此,虽然你可能有足够的可用内存,但你可能没有足够大的内存块.
你自己的数字(1M x 64)是不够的,只有足够的其他分配才能解释这个问题.您可以尝试解决此特定问题,但这可能只是更大问题变得可见的问题.
通常,TaskManager不是诊断内存问题的正确工具.你需要一个内存分析器来找出发生了什么.
它还取决于您的平台版本以及它是32位还是64位.