为什么net core 2.0中的垃圾收集器不释放所有内存

use*_*375 2 c# .net-core .net-core-2.0

我在net core 2.0上运行简单的代码,在垃圾收集后我的程序仍然消耗140 MB的内存.有谁知道为什么以及如何减少它?我也有一个问题.控制台应用程序和Web应用程序中的垃圾收集之间是否存在差异?

var rand = new Random();

var list = new List<Test>();

for(int i = 0; i < 10_000_000; i++)
{
    list.Add( new Test {
        Id  = i,
        Number = rand.NextDouble(),
        Number1 = rand.NextDouble(),
        Number2 = rand.NextDouble(),
        Number3 = rand.NextDouble(),
        Number4 = rand.NextDouble(),
        Number5 = rand.NextDouble(),
        Number6 = rand.NextDouble(),
        Number7 = rand.NextDouble(),
        Number8 = rand.NextDouble(),

    });
}

Console.WriteLine("End of generation");
Console.ReadLine();

for(int i = 0; i < list.Count; i++)
{
    list[i] = null;
}

list = null;

GC.Collect(1);

GC.WaitForPendingFinalizers();

GC.Collect(2);

GC.WaitForPendingFinalizers();

GC.Collect(3);

GC.WaitForPendingFinalizers();

Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

Fab*_* H. 6

我测试了你的代码,它确实如你所描述的那样.我拍了一张快照,看了看对象,List<Test>内存中还有一个.

如果在发布模式下运行它,则会按预期释放所有内存.

所以我猜,这是调试模式下的错误行为.

编辑:LasseVågsætherKarlsen发表了一篇有趣的评论:

Debug将某些对象的生命周期延长到方法的末尾,以允许您检查变量.

我测试了它,如果你将产生列表的代码放在一个单独的方法中,所有内存都被释放.

  • 我真的不会把它称为一个错误,几乎可以肯定它是如何工作的. (4认同)