考虑以下代码:
string value = new string('a', int.MaxValue);
当我们运行该代码时,OutOfMemoryException发生.Windows 8中的Physical memory限制为128 GB。
为什么.Net会为此代码抛出OutOfMemoryException
?
此代码也永远不会抛出OutOfMemoryException:
List<string> list = new List<string>();
for (int i = 0; i < 100000000000; i++)
{
list.Add(new string('a', 100 ));
}
我在64位模式下运行。
答案 0 :(得分:5)
.NET中对象的最大大小为2 GB,即使在64位系统上启用了gcAllowVeryLargeObjects
(gcAllowVeryLargeObjects
上的文档读取字符串的最大大小和其他非数组对象没有改变。,我想是因为它的实现方式。)
这意味着您只能分配大小为2GB的字符串。由于sizeof(char)
为2,并且您在类本身中有一点开销,因此您可以设置的最大大小为int.MaxValue / 2 - 32
。
答案 1 :(得分:4)
第一个示例需要1个连续内存的int.MaxValue * 2。你的第二个例子需要100000000000个100字节* 2的连续内存。
.NET无法找到足够大的单个块以将其全部放入一个空间。
对象大小也有2GB硬限制。在64位平台上,您可以使用gcAllowVeryLargeObjects
使其更大,但该设置仅影响数组,不会影响字符串的限制。