发生OutOfMemoryException时?

时间:2016-12-06 07:12:59

标签: c# memory-management

考虑以下代码:

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位模式下运行。

2 个答案:

答案 0 :(得分:5)

.NET中对象的最大大小为2 GB,即使在64位系统上启用了gcAllowVeryLargeObjectsgcAllowVeryLargeObjects上的文档读取字符串的最大大小和其他非数组对象没有改变。,我想是因为它的实现方式。)

这意味着您只能分配大小为2GB的字符串。由于sizeof(char)为2,并且您在类本身中有一点开销,因此您可以设置的最大大小为int.MaxValue / 2 - 32

答案 1 :(得分:4)

第一个示例需要1个连续内存的int.MaxValue * 2。你的第二个例子需要100000000000个100字节* 2的连续内存。

.NET无法找到足够大的单个块以将其全部放入一个空间。

对象大小也有2GB硬限制。在64位平台上,您可以使用gcAllowVeryLargeObjects使其更大,但该设置仅影响数组,不会影响字符串的限制。