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

Sau*_*aul 4 .net c# arrays memory-management

这个抛出一个OutOfMemoryException.

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

using System;

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

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

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

Pet*_*ano 8

这是2千兆字节的内存.最大值为32位int为2147483647,转换为兆字节为2048或2千兆字节.机器实际上可能已经耗尽内存.请参阅:.NET进程可以分配的最大内存


seh*_*ehe 6

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

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

  • [Eric Lippert这样说](http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx )*而是发生"内存不足"错误,因为进程无法在其虚拟地址空间中找到足够大的连续未使用页面部分来执行请求的映射.* (2认同)