这是我的代码:
public class Class1 { public int[][] binArray; public Class1() { binArray = new int[1000][]; for (int i = 0; i < 1000; i++) { binArray[i] = new int[61608]; } } }
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
Class1 c2 = new Class1();
Class1 c3 = new Class1();
Class1 c4 = new Class1();
Class1 c5 = new Class1();
Class1 c6 = new Class1();
Class1 c7 = new Class1(); // Memory will run out at about this point
Class1 c8 = new Class1();
Class1 c9 = new Class1();
Class1 c0 = new Class1();
Console.WriteLine();
}
}
Class1用于存储数组,我认为它将为24GB的内存机器获得足够的61608 * 4字节的内存片段,为什么在初始化第7类时它仍会抛出out of memory exception
?
答案 0 :(得分:6)
这几乎可以肯定是因为您将可执行文件构建为32b。即使在64b机器上运行超过~3GB的内存,它仍然会爆炸。编译为64b,你会没事的。
答案 1 :(得分:2)
这看起来像是以32位执行。每个类实例使用大约250mb的内存(1000 * 61608 * 4 +开销),因此7个实例将使用大约1.7gb的内存。这通常是.NET 32位进程耗尽内存并且不再能够分配大片段的地方。
如果你在VS 2012中构建,请注意,默认情况下,AnyCPU
(默认目标)仍将以x86为目标,因为有一个新的“Prefer 32bit”选项。关闭该选项将导致AnyCPU
构建并作为64位进程运行。
或者,您可以明确地将x64作为64位进程运行。
答案 2 :(得分:0)
这是一个人们不希望遇到的“陷阱”。
或新更新的网址
http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os
“在VS2010 for .NET 4.0中创建新的Visual C#控制台应用程序时,项目的默认目标设置是针对x86平台,而不是像Visual Studio 2008那样的任何CPU(MSIL)”
检查csproj的属性(特别是如果它是控制台应用程序)