当前位置: 首页 > 知识库问答 >
问题:

C#GC不释放内存[重复]

翁良弼
2023-03-14

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

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

有人知道为什么我包含的代码会丢失内存吗?没有一份名单被保留,可以立即清理。

谢谢,

保罗

复制:全新的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);
}

共有1个答案

赏高格
2023-03-14

好的,这会复制,但仅在以下条件下:

  • FX4.5,平台=任何CPU,配置=调试

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

所以,初步结论:没有优化的List

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

但是,尽管看起来确实存在问题,但很容易避免。

 类似资料:
  • 当垃圾收集器运行并释放内存时,内存会返回操作系统还是作为进程的一部分保留下来。我的强烈印象是,内存实际上从未释放回操作系统,而是作为内存区域/池的一部分保留下来,供同一进程重复使用。 因此,进程的实际内存永远不会减少。提醒我的一篇文章是这样的,Java的运行时是用C/C写的,所以我想同样的事情也适用? 更新< br >我的问题是关于Java的。我提到C/C是因为我假设Java的分配/释放是由JRE

  • 问题内容: 当垃圾收集器运行并释放内存时,该内存将返回操作系统,还是作为进程的一部分保留。我印象深刻的是,该内存实际上从未释放回OS,而是保留为内存区域/池的一部分,以供同一进程重用。 结果,进程的实际内存将永远不会减少。一篇使我想起的文章是Java的Runtime是用C / C ++编写的,所以我想同样的事情适用吗? 更新 我的问题是关于Java的。我之所以提到C / C ++,是因为我假设Ja

  • 本文向大家介绍c# 从内存中释放Selenium chromedriver.exe,包括了c# 从内存中释放Selenium chromedriver.exe的使用技巧和注意事项,需要的朋友参考一下 背景 我设置了一个c#代码来运行Selenium chromedriver.exe.在运行结束时,我有browser.close()来关闭实例。(browser = webdriver.Chrome(

  • > 指向自动分配实例的指针是否可以使该实例即使在实例化的作用域被保留后也不被解除分配? <罢工> 在 我读到的这篇文章说所有指向去分配内存的指针都是无效的。 但这家伙说的是手动解锁还是自动解锁后的行为? 这是一个示例:

  • 我对C#中的单例模式在C++中释放对象内存有一个困惑;这里是C++代码: 当我使用rocket::close()时,ms_rocket指向的内存空间将被释放,ms_rocket变成一个野指针,第二个“cout 在C#中,我认为当我使用Dispose()时,内存(B单例中的'a'对象)会被释放,但在第二次访问中,age值不应该是100,静态变量'a'会变得像野指针一样。谁能告诉我为什么?

  • 当我在执行语句后检查分配给的内存地址时,我发现内存内容为0。因为我读到没有将内存初始化为0,所以这是正确的行为吗?