2

这是我的代码:

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 字节的内存碎片,为什么out of memory exception在我初始化第 7 类时它仍然会抛出一个?

4

4 回答 4

6

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

于 2013-02-25T21:03:47.313 回答
2

这看起来像您以 32 位执行。每个类实例使用大约 250mb 的内存(1000*61608*4 + 开销),因此 7 个实例将占用大约 1.7gb 的内存。这通常是 .NET 32 位进程内存不足的地方,并且不再能够分配大片段。

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

或者,您可以明确地将 x64 定位为作为 64 位进程运行。

于 2013-02-25T21:06:06.400 回答
1

对此进行一些快速的信封计算;

  • 新的 61608 个元素的 int 数组。为数组指针加 1(对此有待更正),所以 61609
  • 乘以 1000 = 61609000,数组指针再加 1,61609001
  • 乘以 4int等于Int32,每得到 246436004 个字节Class1
  • 每个叶子实例乘以 7 Class11,725,052,028 字节...大约所以我们正在查看仅由数组占用的大约 1.6Gbs

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

于 2013-02-25T21:14:39.733 回答
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 中为 .NET 4.0 创建新的 Visual C# 控制台应用程序时,项目的默认目标设置是针对 x86 平台而不是像 Visual Studio 2008 那样的任何 CPU (MSIL)”

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

于 2013-02-25T21:28:12.897 回答