为什么我不能在.NET中创建大小超过2GB的对象,即使在x64上也是如此?

时间:2010-06-25 07:22:32

标签: .net memory memory-management 64-bit memory-limit

阅读Are C# Strings (and other .NET API’s) limited to 2GB in size?后,我在.NET 3.5中使用大字符串和数组。我发现我可以分配的最大数组是int.MaxValue - 56个字节。字符串类似的东西:我能得到的最大字符是(int.MaxValue - 58) / 2个字符(因为每个字符占用2个字节)。之后它抛出OutOfMemoryException

为什么存在这种限制?并非我在实践中遇到过这种情况 - 我只是对.NET的内部运作感到好奇。

是的,这是在64位机器上有足够的RAM,当然 - 是的,这个过程是作为一个64位进程运行的。 (我实际上可以分配3个这样的数组或字符串,总内存使用量为6GB。)

2 个答案:

答案 0 :(得分:1)

设计决定将GC堆上的对象大小限制为2GB,即使在x64上也是如此。参与设计决策的人员之一的博客文章很好:

http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx

答案 1 :(得分:1)

在4.5之前的.NET版本中,最大对象大小为2GB。从4.5开始,如果启用gcAllowVeryLargeObjects,您可以分配更大的对象。请注意,string的限制不受影响,但“数组”也应该包含“列表”,因为列表由数组支持。