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)
我测试了你的代码,它确实如你所描述的那样.我拍了一张快照,看了看对象,List<Test>内存中还有一个.
如果在发布模式下运行它,则会按预期释放所有内存.
所以我猜,这是调试模式下的错误行为.
编辑:LasseVågsætherKarlsen发表了一篇有趣的评论:
Debug将某些对象的生命周期延长到方法的末尾,以允许您检查变量.
我测试了它,如果你将产生列表的代码放在一个单独的方法中,所有内存都被释放.