我在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);
}
答案 0 :(得分:2)
好的,这确实会重现,但仅限于以下条件:
通过选择x64平台或发布模式,程序按预期运行。
因此,暂时的结论是:在没有优化的情况下,List<>
仍然存在于根本不应该存在的地方。所以GC调用完全没有效果,x86内存空间很快耗尽。
这可能是一个错误,也可能是一个旨在调试的“功能”。
但是,虽然确实存在问题,但很容易避免。