2013-03-06 74 views

回答

13

從這個線程在這裏:Is the garbage collector in .net system-wide or application-wide?,它發生在工藝水平。該進程中的所有線程都將暫停,但不會跨越多個進程。

一個或多個應用程序域可以在一個進程中存在,但應用程序域不進程之間共享。每個:http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx,「過程中的所有應用程序共享相同的GC。」因此,當觸發GC時,GC應該會影響所有應用程序域。

然而,可以有太多的流程花費時間做GC不能參與GC的其他進程的性能產生負面影響會出現CPU的性能影響。

這個鏈接也解釋了GC的基本面太:

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

16

很難回答,最好的辦法是剛剛測試:

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

輸出:

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

很好的證據表明GC影響默認CL上的所有AppDomain R主機。這讓我感到驚訝。

+0

你確定每個應用程序域都有它自己的堆?在這裏反駁布賴恩·拉斯穆森的回答是:http://stackoverflow.com/questions/574708/what-is-appdomain 和Aghilas Yakoub的答案在這裏: http://stackoverflow.com/questions/12219815/appdomains-and-gc-堆 – 2013-03-06 14:07:50

+0

「AppDomain是同一進程的一部分,因此實際上共享相同的託管堆」。這與你所說的不矛盾嗎?另見我的評論編輯,Aghilas說:「你有一堆進程,並且應用程序域共享這個堆。」除非我誤解,否則似乎至少有一個答案(你的或他們的)需要更正。 – 2013-03-06 14:13:21

+1

好的,我會調低一點。它們在邏輯上是不同的,因爲對象句柄指向AppDomain特定的數據結構。因此需要跨域進行編組。但是測試中肯定有證據表明GC堆本身是共享的。 – 2013-03-06 14:22:21