4

这个抛出一个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];
        }
    }
}

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

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

4

6 回答 6

8

那是 2 GB 的内存。32 位 int 的最大值为 2147483647,转换为兆字节为 2048,即 2 GB。机器实际上可能内存不足。请参阅:.NET 进程可以分配的最大内存

于 2012-12-05T16:18:10.707 回答
6

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

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

于 2012-12-05T16:20:36.557 回答
1

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

于 2012-12-05T16:19:54.193 回答
1

问题可能不在于您没有“可用”内存,而是您已经将内存碎片化,以至于当您尝试创建数组并且必须调整其大小时,没有单个可用内存块可以容纳它.

于 2012-12-05T16:20:29.670 回答
1

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

看到这个链接

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

请看这个链接

于 2012-12-05T17:00:37.717 回答
1

事实证明,这是因为托管 .NET 应用程序中创建的任何对象都有硬编码的内存限制:

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

 

也可以看看

于 2012-12-05T17:18:23.263 回答