我知道这是一个老问题,但是由于没有答案提到大对象堆,因此这可能对发现此问题的其他人有用...
.NET中任何超过85,000字节的内存分配都来自大对象堆(LOH),而不是普通的小对象堆。为什么这么重要?因为没有压缩大对象堆。这意味着大对象堆变得碎片化,根据我的经验,这不可避免地导致内存不足错误。
在原始问题中,列表中包含50,000个项目。在内部,列表使用数组,并假设需要50,000 x 4bytes的32位= 200,000字节(如果是64位,则为两倍)。因此,内存分配来自大型对象堆。
所以你对此能做些什么?
如果您使用的是4.5.1之前的.net版本,那么您所能做的就是意识到这一问题并设法避免它。因此,在这种情况下,如果没有列表中包含的车辆不超过18,000个元素,则可以使用车辆列表的清单。这可能会导致一些难看的代码,但这是可行的解决方法。
如果使用的是.net 4.5.1或更高版本,则垃圾收集器的行为已发生了细微变化。如果在要进行大内存分配的位置添加以下行:
System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;
它将迫使垃圾收集器压缩大对象堆-仅在下一次。
它可能不是最佳解决方案,但以下方法对我有用:
int tries = 0;
while (tries++ < 2)
{
try
{
. . some large allocation . .
return;
}
catch (System.OutOfMemoryException)
{
System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
}
}
当然,这仅在您具有可用的物理(或虚拟)内存时才有用。
selectedVehicles
?