[.net]在64位操作系统上,当单个对象大于2 GB时,.net会引发什么异常?

[.net]在64位操作系统上,当单个对象大于2 GB时,.net会引发什么异常?,.net,.net,我肯定我曾经见过这种事发生在我身上。在一个有8GB内存的64位操作系统中,当一个数组大约为2GB时,我仍然会遇到一个异常。异常名称是什么 请不要告诉我我的程序不好,因为我不应该那样做。相信我,这是必须的 编辑:该程序以64位进程运行。可能吗?仅仅因为你的机器有8GB的内存并不意味着你的应用程序可以访问所有的内存 在不知道您发布了什么的情况下,我会假设您的应用程序正在32位进程中运行(即使您在64位处理器上),因此仅限于该32位进程的2GB虚拟地址空间。当然,这只是猜测,有很多原因可以让你看到一个

我肯定我曾经见过这种事发生在我身上。在一个有8GB内存的64位操作系统中,当一个数组大约为2GB时,我仍然会遇到一个异常。异常名称是什么

请不要告诉我我的程序不好,因为我不应该那样做。相信我,这是必须的

编辑:该程序以64位进程运行。

可能吗?仅仅因为你的机器有8GB的内存并不意味着你的应用程序可以访问所有的内存


在不知道您发布了什么的情况下,我会假设您的应用程序正在32位进程中运行(即使您在64位处理器上),因此仅限于该32位进程的2GB虚拟地址空间。当然,这只是猜测,有很多原因可以让你看到一个
OutOfMemoryException
,没有更多的细节就无法解释原因。

你应该得到一个
系统。OutOfMemoryException


请看下面的讨论。(很抱歉google缓存结果,在回答此问题时,dotnet247.com网站似乎已关闭)

以下是我的Windows Server 2008 64位8Gb RAM上的OutOfMemoryException:

var a = new int[int.MaxValue];
我检查了代码(Vista Ultimate 64位,物理内存为4GB):

byte[] x = new byte[2147483648];
抛出OverflowException(因为2147483648不适合签名int)

抛出OutOfMemoryException

byte[] x = new byte[2147483591];
已成功分配阵列,这是在我的计算机上工作的最大大小

根据这篇文章,这是一种人为地将托管对象大小限制为2GB的设计选择


您可以使用p/Invoke分配非托管内存,如果必须的话,还可以使用不安全的代码和指针访问它。

为什么OutOfMemoryException链接到Mellis的代理项目?这里描述了OOM异常吗?我错了!这是一个链接,我复制了另一个答案-谢谢你抓住这一点。
byte[] x = new byte[2147483591];