C# · 12月 25, 2021

C#列出内存不足但远离2Gb限制

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