为什么这个c#程序会在64位24GB内存的计算机上耗尽内存?

本文关键字:内存 计算机 24GB 64位 程序 为什么 | 更新日期: 2023-09-27 18:01:18

这是我的代码:

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用于存储数组,我认为它将获得足够的61608*4字节的内存片段为24GB的内存机器,为什么它仍然抛出一个out of memory exception当我初始化第7类?

为什么这个c#程序会在64位24GB内存的计算机上耗尽内存?

这几乎肯定是因为您将可执行文件构建为32b。即使在64b的机器上运行,一旦超过3GB的内存,也会爆炸。编译为64b,就可以了。

这看起来像你以32位执行。每个类实例使用大约250mb的内存(1000*61608*4 +开销),因此7个实例将使用大约1.7gb的内存。这是典型的。net 32位进程耗尽内存的情况,并且不再能够分配大的片段。

如果你在VS 2012中构建,要意识到,默认情况下,AnyCPU(默认目标)仍然针对x86,因为有一个新的"首选32位"选项。关闭该选项将导致AnyCPU作为64位进程构建和运行。

或者,您可以显式地将x64作为64位进程运行。

关于这个的一些简单的计算;

  • 新的int数组的61608个元素。为数组指针添加1(立场对此进行纠正),因此61609
  • 乘以1000 = 61609000,再加1为数组指针,61609001
  • 乘以4,int相当于Int32,每个Class1得到246436004字节
  • 乘以7每个Class1实例留下1,725,052,028字节…所以我们看到的是仅阵列就占用了大约1.6 gb

现在应用程序本身将占用更多的空间,因为我没有占到相当多的空间。内存不足异常的一个可能原因是由于系统上可能发生的分页。操作系统不保证程序的内存将驻留在RAM中。你的操作系统的页面文件设置是什么?

这是一个人们意想不到的"陷阱"。

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

或新更新的URL

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

"当在VS2010中为。net 4.0创建一个新的Visual c#控制台应用程序时,该项目的默认目标设置是针对x86平台,而不是像Visual Studio 2008那样针对任何CPU (MSIL) "

检查你的csproj的属性(特别是如果它是一个控制台应用程序)