2010-06-25 46 views
1

阅读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中创建大于2GB的对象,即使在x64上也是如此?

为什么这个限制存在?并非我在实践中碰到过它 - 我只是对.NET的内部工作感到好奇。

是的,这是在64位机器上有大量内存,当然 - 是的,这个过程是以64位进程运行的。 (我实际上可以分配3个这样的阵列或字符串,总共6GB的内存使用量。)

回答

1

这是一个设计决定,将GC堆上的对象大小限制为2GB,即使在x64上也是如此。良好的博客帖子上这里从那些参与设计决策之一:

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

+0

谢谢。这证实这是一个有意识的设计决定,尽管它并没有真正解释他们为什么做出这个决定。 – EMP 2010-06-25 08:29:23

0

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