2013-07-10 128 views
3

我有一段糟糕的时间,C#没有释放内存,因为我没有再引用它,因此我在内存中保留了一个大的结构。C#GC没有释放内存

我已经在下面列出了一些代码,展示了一个类似的问题,我有一个。我想我一定是误解了一些GC,因为我不确定为什么下面的代码会抛出一个内存异常。

有谁知道我为什么包含的代码会导致内存不足?没有任何名单正在举行,他们立即可以清理。

感谢,

保罗

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

异常将在for循环的第一次迭代中抛出在第三个“新列表”上。如果省略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); 
} 
+0

在你的真实程序中,你使用GC吗?你应该尝试让程序尽可能地做自己的gc – Sayse

+0

这里只是我的看法,但是如果你需要做大量细粒度的内存管理和GC,C#可能不适合这项工作。类似于C/C++可能更适合。 – Gray

+0

以下哪一行会引发异常?第一个还是另一个? –

回答

2

行,这并再现,但只有在下列条件下:

  • Fx的4.5,平台=任何CPU,配置=调试。

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

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

这可能是一个错误,或者它可能是一个旨在调试的'功能'。

虽然似乎有问题,但很容易避免。

+0

不幸的是,即使选择了发布模式,我仍然遇到错误。 – skippy10110

+0

可以肯定,是[]优化检查? –

+0

我相信这实际上是一个与调试有关的“特征”,但我不是100%肯定的。我读到一个很棒的答案,我回想起来,不久前我解释了类似的东西,我会尽力找到答案(实际上,我最初认为你写了答案,也许不是。)当然,如果答案是正确的,它发生在一个优化的构建...这是错误的。 –