26

FullGC 通常会在运行时暂停所有线程。有两个 AppDomain,每个都运行多个线程。当 GC 运行时,会暂停所有线程,还是只暂停其中一个 AppDomain 的线程?

4

2 回答 2

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 会影响默认 CLR 主机上的所有 AppDomain。这让我很惊讶。

于 2013-03-06T13:41:14.200 回答
14

从这里的线程:垃圾收集器是在.net 系统范围内还是应用程序范围内?,它发生在进程级别。该进程中的所有线程都将暂停,但不会跨多个进程。

一个或多个应用程序域可以存在于一个进程中,但应用程序域不能在进程之间共享。每: http: //blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx,“进程中的所有appdomains共享同一个 GC。” 因此,GC 应该在触发 GC 时影响所有应用程序域。

但是,过多的进程花费时间执行 GC 可能会导致 CPU 性能下降,这可能会对未参与 GC 的其他进程的性能产生负面影响。

这个链接也解释了 GC 的基本原理:

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

于 2013-03-06T12:24:22.910 回答