为什么我得到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;
}
我做错了什么?还是说这根本不可能!
. 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
您正在尝试分配大约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;
}
}