2011-07-04 28 views
3

は、私は、これらの結果なぜGC.GetTotalMemoryが異なる結果を返すのですか?

結果の最初と残りの部分との間の差があるのはなぜ

enter image description here

取得このコード

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

をしようとすると?

+1

[*近似**](http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory%28v=VS.80%29.aspx)バイト数* – V4Vendetta

+0

また、割り当てられたメモリにわずかな変動を引き起こすバックグラウンドスレッドが常に存在します。 – Ringding

答えて

4

これはあなたのコードは次のように翻訳されることになりますのために一つの理由:オン

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

上記のコードの2行目、Stringクラスはまだ初期化されていない場合は初期化されています。つまり、静的フィールドが初期化され、静的コンストラクターが呼び出されます(存在する場合)。その後、Concat()メソッドが呼び出され、実行中に必要なすべてのクラスも初期化されます。

第3行目では、Consoleクラスがまだ初期化されていない場合は初期化されています。それからもちろん、すべてのクラスはWriteLine()の実行中に使用されます。

すべての静的フィールドにはメモリが必要なので、2回目にGC.GetTotalMemory()を呼び出すと、いくらか高い数値が返されることになります。

1

確かにわかりませんが、Console.WriteLineはメモリを消費しています...それは1回の呼び出しでメモリ値が変更されないためです。

持っているあなたは、より詳細にものを見つけるために、この答えのヘルプを見て:High memory usage with Console.WriteLine()

関連する問題