【问题标题】:Why does creating a new array throw OutOfMemoryException?为什么创建一个新数组会抛出 OutOfMemoryException?
【发布时间】:2012-11-23 12:51:16
【问题描述】:

这个抛出一个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 位正整数,但显然这不是唯一需要注意的限制。

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

【问题讨论】:

  • 嗯,你知道的,它可能内存不足
  • 其他数据结构,如 List 动态分配内存,虽然这可能有一些性能劣势,但您可以避免在声明时耗尽内存。有没有理由宣布如此庞大的数组? (我可能应该说“动态调整大小”而不是分配)
  • @sehe - 内存可用,但原来有一个硬编码的2GB limit to object size

标签: c# .net arrays memory-management


【解决方案1】:

事实证明,这是因为在托管 .NET 应用程序中创建的任何 对象 都有一个 hardcoded memory limit

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

 

另请参阅

【讨论】:

    【解决方案2】:

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

    this link

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

    请看this link

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • Eric Lippert put it this way 因为进程无法在其虚拟地址空间中找到足够大的连续未使用页面部分来执行请求的映射,所以会发生“内存不足”错误。
      【解决方案4】:

      问题可能不是您没有“可用”内存,而是您的内存碎片太多,以至于当您尝试创建数组并且必须调整其大小时,没有单个可用内存块能坚持住。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 您仍然可以使用此代码在 64 位计算机上溢出 RAM。
        • 还是绝对有可能溢出的!我只是在解决这样一个事实,即 64 位系统具有更大的地址空间来包含这样的请求。这仍然是永远不应该做的事情。
        • @TheGreatCO 32 位系统执行此操作时错误,执行此操作时 64 位系统可能错误。
        • 是的,以这种方式创建一个数组是浪费内存,除非你一直填充它。
        【解决方案6】:

        这是 2 GB 的内存。 32 位 int 的最大值为 2147483647,转换为兆字节为 2048,即 2 GB。机器实际上可能内存不足。见:Maximum Memory a .NET process can allocate

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2014-09-30
        • 1970-01-01
        相关资源
        最近更新 更多