我已经解决了这个问题。将目标平台从“任何”切换到x64将允许我成功运行此程序(分配64 GB,这是我的物理内存限制的两倍):
byte[][] test = new byte[64][];
for (int i = 0; i < 64; i++)
test[i] = new byte[1000000000];
我仍然很困惑为什么这个问题看似突然冒出来,但确实存在。
编辑:我已经尝试了大地址识别标志,并且gc允许大对象。它打破了第二个应用程序,其中i = 2(换句话说,当分配第三组5亿个bool,或15亿总bool,或前1.5 GB的RAM)。这不是接近.NET 4.5默认的3GB限制。如果你仔细阅读,第一个应用程序工作正常,直到一天前突然间,当内存使用量超过1 GB时,它开始抛出内存异常。
Edit1:大多数人似乎都忽略了我的问题。第一个应用程序运行得很好(一个月)直到昨天,它开始在appx抛出内存异常。 1GB的内存使用量。两天前(当它运行良好时)和昨天不再运行时会发生什么变化?
Edit2:这个问题不重复。你必须意识到我的应用程序工作正常一个月,直到昨天。对我的机器的唯一改变是将FLStudio从FL 11升级到FL 12.我将完全卸载FL并查看是否有任何改变,但我非常怀疑它会不会。
首先,一些背景信息:问题不在于内存不足。我有32 GB的RAM,并运行64位版本的Windows。我希望问题很简单,如果是的话,我不必来这里寻求帮助。
所以我构建了这个应用程序:
uint arraySize = 2000000000;
uint squareRoot = Convert.ToUInt32(Math.Sqrt(arraySize));
bool[] sieveContainer = new bool[arraySize];
ulong sum = 0;
for (int baseMultiple = 2; baseMultiple < squareRoot; baseMultiple++)
{
if (sieveContainer[baseMultiple] == false)
{
for (int multiples = baseMultiple * 2; multiples < arraySize; multiples += baseMultiple)
sieveContainer[multiples] = true;
}
}
for (int j = 2; j < arraySize; j++)
{
if (sieveContainer[j] == false)
sum++;
}
这完全没问题,并乐于消耗大约2GB的RAM。直到昨天。一旦它突破1GB(有时甚至是0.75GB),我就会遇到内存不足异常。我开始寻找潜在的解决方案,并发现我找不到有关我的问题的足够信息。所以我构建了这个测试应用程序:
byte[][] test = new byte[16][];
for (int i = 0; i < 16; i++)
test[i] = new byte[500000000];
再一次,在分配1GB的RAM时,我收到System.OutOfMemoryException错误。没有提供其他信息。我已经尝试了所有我能想到的/从互联网上有信誉的资源中找到的东西,并且无法找到解决方案。 (没有结果的解决方案立即被逆转)。
为什么我只能在整个应用程序中使用1GB内存,而昨天我可以使用+ 2GB?我没有搞乱Visual Studio中的任何设置,也没有在我的机器中更改任何内容。我跑了MalwareBytes,一无所获。我没有想法,你有没有?