为什么这个C#程序在具有24GB内存的64位计算机中会耗尽内存?

时间:2013-02-25 20:59:22

标签: c# out-of-memory

这是我的代码:

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

3 个答案:

答案 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-aspx

或新更新的网址

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的属性(特别是如果它是控制台应用程序)