为什么我得到OutOfMemoryException而试图使大小为int. maxvalue的int数组

本文关键字:int 小为 maxvalue 数组 OutOfMemoryException 为什么 | 更新日期: 2023-09-27 18:18:06

我试图创建一个数组,其中包含所有可能的正整数,我尝试了以下代码,它总是抛出内存异常。

private int[] AllIntegers()
{
    int[] all = new int[int.MaxValue];
    for (int i = 0; i < int.MaxValue; i++)
    {
        all[i] = i;
    }
    return all;
}

我做错了什么?还是说这根本不可能!

为什么我得到OutOfMemoryException而试图使大小为int. maxvalue的int数组

. net对象大小有硬性上限,它们不能大于2gb。即使是在64位操作系统上。您的数组远远超出了这个大小。

在32位操作系统上,你永远不会接近这个限制,可用的最大一块连续虚拟内存大约在650兆字节左右。只有在启动时,它才会迅速下坡。这是地址空间碎片的副作用,是由于地址空间中混合了代码和堆而造成的。只要每次分配的大小足够小,您可以分配的总内存量接近2 gb。这不是你想要接近的东西,由于OOM导致的随机程序失败很难处理。

Int.MaxValue = 2,147,483,647, sizeof(int) = 4,因此您需要8 GB的内存来分配这个数组。此异常表明您的操作系统无法分配此数量的内存量。

== UPDATE ==

MSDN:

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

参见:BigArray,绕过2GB数组大小限制

您正在尝试分配大约4 *(2^32 -1)字节的内存。这正好是8GB,可能超过了您的系统所能提供的容量,或者更确切地说,超过了您的进程所能分配的容量。

如果你在32位操作系统上(在64位操作系统上这可能会改变),整数是4字节(32位)。因此是int。MaxValue是2^31(2^31有符号,2^31无符号),所以你试图分配一个2^31个整数的数组。每个字节乘以4个字节,得到8589934592字节,正好是8gb字节。

正如其他人所说,您不可能同时在内存中保存所有这些信息。要获得所有自然数的列表,只需使用迭代器块,它一次只在内存中保存一个int,加上方法状态信息:

static void Main (string[] args)
{
    foreach (int i in Program.NaturalNumbers ())
    {
        Console.WriteLine (i);
    }
}
public static IEnumerable<int> NaturalNumbers ()
{
    for (int i = 0; i <= int.MaxValue; i++)
    {
        yield return i;
    }
}