为什么创建一个新数组会抛出OutOfMemoryException?

时间:2012-12-05 16:16:03

标签: c# .net arrays memory-management

这一个抛出OutOfMemoryException

目标框架 .NET 3.5 ,在 64位Windows 2008 R2标准版上运行。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] test = new byte[Int32.MaxValue];
        }
    }
}

根据文档,数组长度必须只是一个正32位整数,但显然这不是唯一需要注意的限制。

为什么在这种情况下内存耗尽?

6 个答案:

答案 0 :(得分:8)

这是2千兆字节的内存。最大值为32位int为2147483647,转换为兆字节为2048或2千兆字节。机器实际上可能已经耗尽内存。请参阅:Maximum Memory a .NET process can allocate

答案 1 :(得分:6)

除了显而易见的“内存不足”语义之外,还有一个稍微更为细微的堆碎片问题:可能有超过2Gb或RAM可用,但它可能不是连续

这称为碎片。 dotNET有一个堆分析器,可以在这种情况下显示。

答案 2 :(得分:1)

在标准32位系统上,由于RAM大小,这是不可能的。你会溢出记忆。在64位系统上,这是可能的,因为您有更多的地址空间,但仍然不推荐,因为您希望支持32位和64位系统以及您将要使用的任何标准应用程序。

答案 3 :(得分:1)

问题可能不在于你没有“可用”的内存,而是你已经将内存分散了太多,以至于当你尝试创建数组时,它必须调整大小,没有单个可用内存块能坚持下去。

答案 4 :(得分:1)

Int32.MaxValue = 2 147 483 647 bytes = 2048兆字节

请参阅this link

在“内存和地址空间限制”中,请参阅“每个32位进程的用户模式虚拟地址空间”和“每个64位进程的用户模式虚拟地址空间”。所以它似乎不是操作系统的限制。

请参阅this link

答案 5 :(得分:1)

事实证明这是因为在托管.NET应用程序中创建的任何对象都有hardcoded memory limit

  

在64位Windows上运行64位托管应用程序时   在操作系统中,您可以创建不超过2千兆字节的对象   (GB)。

另见