2013-03-06 12 views

Odpowiedz

13

Z tego wątku tutaj: Is the garbage collector in .net system-wide or application-wide?, występuje na poziomie procesu. Wszystkie wątki w tym procesie zostaną wstrzymane, ale nie w wielu procesach.

Jedna lub wiele domen aplikacji może istnieć w procesie, ale domeny aplikacji nie są współużytkowane między procesami. Per: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx, "wszystkie aplikacje uczestniczące w procesie mają taki sam GC." W związku z tym GC powinna wpływać na wszystkie domeny aplikacji po uruchomieniu GC.

Jednak wydajność wydajności procesora może wystąpić, gdy zbyt wiele procesów spędza czas na GC, co może negatywnie wpłynąć na wydajność innych procesów niezaangażowanych w GC.

Ten link wyjaśnia również podstawy GC też:

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

16

Trudno odpowiedzieć, najlepszą rzeczą do zrobienia jest tylko przetestować go:

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

wyjściowa:

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

Dobry dowód, że GC wpływa na wszystkie AppDomains w domyślnym CL Host R. To mnie zaskoczyło.

+0

Czy na pewno każda AppDomena ma własną stertę? Jest to sprzeczne z odpowiedzią Briana Rasmussena: http://stackoverflow.com/questions/574708/what-is-appdomain i odpowiedź Aghilasa Yakouba: http://stackoverflow.com/questions/12219815/appdomains-and-gc- sterty –

+0

"AppDomains są częścią tego samego procesu i dlatego faktycznie udostępniają tę samą zarządzaną stertę". Czy to nie jest sprzeczne z tym, co powiedziałeś? Zobacz także mój komentarz do mojego komentarza, Aghilas mówi: "Masz stertę dla procesu, a domeny aplikacji dzielą tę stertę." O ile się nie mylę, wydaje się, że przynajmniej jedna odpowiedź (twoja lub ich) wymaga korekty. –

+1

Dobra, uspokoję to. Są logicznie różne, ponieważ uchwyt obiektu wskazuje na specyficzną strukturę danych AppDomain. A zatem musi być zebrany w różnych domenach. Ale na pewno są dowody z testu, że sterty GC są podzielone. –

Powiązane problemy