Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';net core 2.0中的t垃圾收集器释放所有内存_C#_.net Core_.net Core 2.0 - Fatal编程技术网

C# 为什么';net core 2.0中的t垃圾收集器释放所有内存

C# 为什么';net core 2.0中的t垃圾收集器释放所有内存,c#,.net-core,.net-core-2.0,C#,.net Core,.net Core 2.0,我在NetCore2.0上运行简单的代码,在垃圾收集之后,我的程序仍然消耗140MB的ram。有人知道我为什么以及如何减少它吗?我还有一个附带的问题。控制台应用程序中的垃圾收集和web应用程序中的垃圾收集有什么区别吗 var rand = new Random(); var list = new List<Test>(); for(int i = 0; i < 10_000_000; i++) { list.Add( new Test { Id =

我在NetCore2.0上运行简单的代码,在垃圾收集之后,我的程序仍然消耗140MB的ram。有人知道我为什么以及如何减少它吗?我还有一个附带的问题。控制台应用程序中的垃圾收集和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();
var rand=new Random();
var list=新列表();
对于(int i=0;i<10_000;i++)
{
列表。添加(新测试){
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(“一代结束”);
Console.ReadLine();
for(int i=0;i
我测试了您的代码,它确实如您所述。我拍了一张快照并查看了对象,内存中仍然有一个
列表

如果在释放模式下运行,所有内存都会按预期释放

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

编辑::

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

我对它进行了测试,如果将生成列表的代码放在一个单独的方法中,那么所有内存都将被释放

如果此引用类型(列表)是此方法的本地引用类型,JIT编译器实际上可以在堆栈而不是堆上分配它,并使用
Console.Readline()堆栈永远不会释放,但我真的不知道如何测试它

关于GC之间的区别,是的,我认为我们公司曾经出现过问题,我们实际上发现控制台应用程序的GC与web应用程序的GC不同。据我所知,web应用程序中的GC是在服务器模式下运行的,不记得控制台应用程序的GC模式


关于GC模式的更多信息:

您是否在.NET framework上测试了此功能,声称这是.NET核心的“问题”?我在.NET framework上进行了尝试,但在发布和调试模式下返回到10 MB。看起来只有在.net core的调试模式下才存在内存问题。在Core2.0上以发布模式运行代码后,它工作正常。@user9159375-您可能应该向Microsoft报告这一情况。这听起来像一个bug,因为它不会在发布模式下发生,所以其他人可能不会报告它。您如何测量RAM消耗?即使GC为进程释放内存,CLR也可能无法快速将其返回到操作系统,或者操作系统可能不会立即将其标记为空闲。请在单独的方法中运行生成列表的代码,查看这是否会改变任何内容。Debug将某些对象的生存期延长到方法的末尾,以允许您检查变量。如果在方法中的任意点创建了临时变量,那么将创建的变量更改为null并不重要,后面可能仍然有一个延迟引用。如果您将此代码移动到一个单独的方法并调用它,在开始收集垃圾之前,这些临时变量将不再存在,并且可能会改变结果。我真的不会将其称为bug,这几乎可以肯定是它的工作方式。使用“单独的方法”很有意义。这对我也有用。