class Program
{
private static void Main()
{
List<byte[]> list = new List<byte[]>(200000);
int iter = 0;
try
{
for (;;iter++)
{
list.Add(new byte[10000]);
}
}
catch (OutOfMemoryException)
{
Console.WriteLine("Iterations: " + iter);
}
}
}
在我的电脑上,最终结果是:
迭代次数: 148008
然后我在每1000次迭代之后的循环中添加了一个 GC.Collect
调用:
//...
for (;;iter++)
{
list.Add(new byte[10000]);
if (iter % 1000 == 0)
GC.Collect();
}
//...
并且惊奇的是:
Iterations: 172048
当我在每10个迭代后调用GC.Collect
时,我甚至得到了193716个循环。有两件奇怪的事情:
手动调用
GC.Collect
如何会产生如此严重的影响(分配增加多达30%)?当没有“丢失”的引用(我甚至预设了List的容量),GC能够收集什么东西?