【问题标题】:Why GC.GetTotalMemory returns different results?为什么 GC.GetTotalMemory 返回不同的结果?
【发布时间】:2011-07-04 10:09:55
【问题描述】:

当我尝试这段代码时

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();
            }

我得到了这些结果

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

【问题讨论】:

  • 因为它的 最好的可用 approximation 字节数
  • 另外,总是有一些后台线程在运行,这会导致分配的内存略有波动。

标签: c# memory-management garbage-collection


【解决方案1】:

其中一个原因是您的代码被翻译成这样的:

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

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

在第三行,Console 类被初始化,如果它还没有被初始化的话。当然还有在执行WriteLine() 期间使用的所有类。

所有静态字段都需要一些内存,因此男性会感觉到,当您第二次调用 GC.GetTotalMemory() 时,您会得到一个更高的数字。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 2013-03-10
      • 2017-04-01
      • 2010-10-31
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多