我在 C# 中度过了一段糟糕的时光,在我不再引用它之后,它没有为我保存在内存中的大型结构释放内存。
我在下面添加了一些代码,这些代码展示了与我遇到的问题类似的问题。我想我一定是误解了关于 GC 的一些东西,因为我不确定为什么下面的代码会抛出内存不足异常。
有谁知道为什么我包含的代码会抛出内存不足?所有列表都不会被保留,并且可以立即清理。
Thanks,
Paul
重现:全新的 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);
}
好的,这确实会重现,但仅限于以下条件:
- Fx 4.5,平台 = 任何 CPU,配置 = 调试。
通过选择 x64 平台或发布模式,程序将按预期运行。
所以,初步结论:在没有优化的情况下List<>
仍然扎根于不该扎根的地方。因此 GC 调用根本不起作用,x86 内存空间很快就会耗尽。
这可能是一个错误,也可能是一个旨在调试的“功能”。
虽然看起来确实存在问题,但很容易避免。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)