2010-04-06 6 views
1

Quelqu'un peut-il me dire la différence entre GC.GetTotalMemory (false) et GC.GetTotalMemory (true);Quelle est la différence entre GC.GetTotalMemory (false) et GC.GetTotalMemory (true)

J'ai un petit programme et quand j'ai comparé les résultats, la première boucle donne un put put < nombre de boucles 0 Diff = 32> pour GC.GetTotalMemory (true); et < nombre de boucles 0 Diff = 0> pour GC.GetTotalMemory (false); mais ne devrait pas être l'inverse?

Le reste des boucles affiche des chiffres qui sont différents dans les deux cas. qu'est-ce que ce nombre indique? pourquoi change-t-il à mesure que la boucle augmente?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 

namespace test 
{ 
    struct Address 
    { 
     public string Street; 
    } 
    class Details 
    { 
     public string Name ; 
     public Address address = new Address(); 

    } 
    class emp :IDisposable 
    { 
     public Details objb = new Details();  
     bool disposed = false; 
     #region IDisposable Members 
     public void Dispose() 
     { 
      Disposing(true); 
     } 
     void Disposing(bool disposing) 
     { 
      if (!disposed) 
       disposed = disposing; 
      objb = null;   
      GC.SuppressFinalize(this); 
     } 

     #endregion 
    } 


    class Program 
    {  
     static void Main(string[] args) 
     {   
      long size1 = GC.GetTotalMemory(false); 
      emp empobj = null;   
      for (int i = 0; i < 200;i++) 
      { 
       // using (empobj = new emp()) //------- (1) 
       { 
        empobj = new emp(); //------- (2) 
        empobj.objb.Name = "ssssssssssssssssss"; 
        empobj.objb.address.Street = "asdfasdfasdfasdf"; 
       } 

       long size2 = GC.GetTotalMemory(false);    
       Console.WriteLine("loop count " +i + " Diff = " +(size2-size1)); 

      } 
     } 

    } 
} 

Répondre

4

Le paramètre définit si oui ou non d'attendre jusqu'à une collecte des ordures complète arrive avant d'exécuter ou non.

Voir MSDN: Paramètres

forceFullCollection
Type: System.Boolean
true pour indiquer que cette méthode peut attendre la collecte des ordures se produire avant de revenir; sinon, faux.

La raison pour laquelle diff est encore 0 pourrait être parce qu'un GC est déjà arrivé même si vous passez false.

+0

une collection complète des ordures ... – Peter

+0

Dans ce cas, quand je passe vrai, je pensais pour obtenir diff = 0, car la méthode attend la récupération de place. mais je reçois le diff = 0 quand je passe faux, ce qui me déroute – somaraj

1

Dans les deux cas, GC.GetTotalMemory() est une estimation de sorte que vous devriez vraiment pas être inquiétant d'une différence de 32 octets ...

Questions connexes