比这更糟糕 - 你是进程空间,当你在 32 位的 .NET 中工作时,它远小于理论限制。在 32 位 .NET 应用程序中,我的经验是,您总是会在 1.2-1.4gb 内存使用量左右开始出现内存不足错误(有些人说他们可以达到 1.6...但我从未见过)。当然,这在 64 位系统上不是问题。
话虽如此,一个 2GB 的引用类型数组,即使在 64 位系统上,也是大量的对象。即使使用 8 字节引用,您也可以分配一个包含 268,435,456 个对象引用的数组——每个引用都可以非常大(最多 2GB,如果它们使用嵌套对象则更多)。这比大多数应用程序真正需要的内存要多。
CLR 团队的一位成员对此发表了博文,并提供了一些解决这些限制的方法的选项。在 64 位系统上,执行 BigArray<T> 之类的操作将是一个可行的解决方案,可以将任意数量的对象分配到一个数组中——远远超过 2gb 的单个对象限制。P/Invoke 也允许您分配更大的数组。
编辑:我也应该提到这一点 - 我不相信这种行为对于 .NET 4 来说根本没有改变。自 .NET 开始以来,这种行为一直没有改变。
编辑:.NET 4.5 现在可以在 x64 中通过在 app.config 中设置gcAllowVeryLargeObjects来明确允许对象大于2gb。