2013-03-06 12 views

risposta

13

Da questo thread qui: Is the garbage collector in .net system-wide or application-wide?, si verifica a livello di processo. Tutti i thread in quel processo verranno messi in pausa ma non tra più processi.

Uno o più domini di app possono esistere all'interno di un processo ma i domini di app non sono condivisi tra i processi. Per: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx, "tutte le appdomain nel processo condividono lo stesso GC." Di conseguenza, GC dovrebbe interessare tutti i domini delle app quando viene attivato un GC.

Tuttavia, è possibile che si verifichi un calo delle prestazioni della CPU con un numero eccessivo di processi che impiegano tempo a eseguire GC, il che può influire negativamente sulle prestazioni di altri processi non coinvolti in un GC.

Questo legame spiega anche i fondamenti della GC troppo:

http://msdn.microsoft.com/en-us/library/ee787088.aspx

16

difficile rispondere, cosa migliore da fare è solo provarlo:

using System; 
using System.Reflection; 

public class Program : MarshalByRefObject { 
    static void Main(string[] args) { 
     var dummy1 = new object(); 
     var dom = AppDomain.CreateDomain("test"); 
     var obj = (Program)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Program).FullName); 
     obj.Test(); 
     Console.WriteLine("Primary appdomain, collection count = {0}, gen = {1}", 
      GC.CollectionCount(0), GC.GetGeneration(dummy1)); 
     Console.ReadKey(); 

    } 
    public void Test() { 
     var dummy2 = new object(); 
     for (int test = 0; test < 3; ++test) { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
     Console.WriteLine("In appdomain '{0}', collection count = {1}, gen = {2}", 
      AppDomain.CurrentDomain.FriendlyName, GC.CollectionCount(0), 
      GC.GetGeneration(dummy2)); 
    } 
} 

uscita:

In appdomain 'test', collection count = 3, gen = 2 
Primary appdomain, collection count = 3, gen = 2 

Buona prova che un GC influisce su tutti gli AppDomain sul CL predefinito R host. Questo mi ha sorpreso.

+0

Sei sicuro che ogni AppDomain abbia il proprio heap? Ciò contraddice la risposta di Brian Rasmussen qui: http://stackoverflow.com/questions/574708/what-is-appdomain e la risposta di Aghilas Yakoub qui: http://stackoverflow.com/questions/12219815/appdomains-and-gc- heap –

+0

"AppDomains fa parte dello stesso processo e quindi condivide lo stesso heap gestito". Non contraddice ciò che hai detto? Vedi anche la mia modifica al mio commento, Aghilas dice "Hai un heap per un processo, e i domini dell'app condividono questo heap." A meno che non sia frainteso, sembra che almeno una risposta (la tua o la loro) abbia bisogno di essere corretta. –

+1

Ok, lo applico. Sono logicamente distinti poiché l'handle dell'oggetto punta a una struttura dati specifica AppDomain. E quindi deve essere eseguito il marshalling tra domini. Ma ci sono prove del test che l'heap GC stesso è condiviso. –

Problemi correlati