4

在我不再引用它之后,我在 C# 中没有为我保存在内存中的大型结构释放内存,这让我感到很糟糕。

我在下面包含了一些代码,这些代码展示了与我遇到的问题类似的问题。我想我一定对 GC 有误解,因为我不确定为什么下面的代码会抛出内存不足异常。

有谁知道为什么我包含的代码会内存不足?没有任何清单被保留,它们可以立即清理。

谢谢,

保罗

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

在 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);
}
4

1 回答 1

4

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

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

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

因此,暂定结论:在没有优化的情况下,List<>s 仍然扎根于它们不应该存在的地方。所以 GC 调用根本没有任何效果,x86 内存空间很快就会耗尽。

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

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

于 2013-07-10T19:35:42.407 回答