为什么GC.GetTotalMemory会返回不同的结果?

时间:2011-07-04 10:09:55

标签: c# memory-management garbage-collection

当我尝试这段代码时

public static void Main()
            {
                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.ReadKey();
            }

我得到了这些结果

enter image description here

为什么第一个和其他结果之间存在差异?

2 个答案:

答案 0 :(得分:4)

这样做的一个原因是你的代码被翻译成这样的东西:

int totalMemory = GC.GetTotalMemory(true);
string s = "Total bytes : " + totalMemory;
Console.WriteLine(s);

在上面代码的第二行,String类已初始化,如果它已经没有。这意味着它的静态字段被初始化并且它的静态构造函数被调用(如果有的话)。然后调用Concat()方法,并在其运行期间所需的所有类也被初始化。

在第三行,Console类被初始化,如果它已经没有了。当然,在执行WriteLine()期间使用的所有类也是如此。

所有静态字段都需要一些内存,所以当你第二次调用GC.GetTotalMemory()时,你会得到更高的数字。

答案 1 :(得分:1)

不确定,但是Console.WriteLine正在消耗内存...这是因为一次调用它后内存值不会改变。

看看这个答案可以帮助您更详细地找到答案:High memory usage with Console.WriteLine()