C#GC没有释放内存

时间:2013-07-10 19:03:22

标签: c# garbage-collection

我在C#上度过了一段糟糕的时光,没有为一个庞大的结构释放内存,而在我不再引用它之后,我会在内存中保留它。

我在下方提供了一些代码,展示了与我所拥有的代码类似的问题。我想我一定是对GC有些误解,因为我不确定为什么下面的代码会抛出Out of Memory Exception。

有谁知道为什么我所包含的代码会丢失内存?没有列表被保留,它们可以立即清理。

谢谢,

Repro:全新的4.5控制台应用程序,将代码粘贴到Main。

在for循环的第一次迭代中,将在第三个" new List"上抛出异常。如果省略for循环,则不会发生OOM。

for (var i = 0; i < 100; i++)
{
    new List<int>(100 * 1000 * 1000);
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true);
    new List<int>(100 * 1000 * 1000);
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true);
    new List<int>(100 * 1000 * 1000);
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true);
    new List<int>(100 * 1000 * 1000);
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true);
}

1 个答案:

答案 0 :(得分:2)

好的,这确实会重现,但仅限于以下条件:

  • Fx 4.5,Platform =任何CPU,配置=调试。

通过选择x64平台或发布模式,程序按预期运行。

因此,暂时的结论是:在没有优化的情况下,List<>仍然存在于根本不应该存在的地方。所以GC调用完全没有效果,x86内存空间很快耗尽。

这可能是一个错误,也可能是一个旨在调试的“功能”。

但是,虽然确实存在问题,但很容易避免。