这一个抛出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位整数,但显然这不是唯一需要注意的限制。
为什么在这种情况下内存耗尽?
答案 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)。
另见