难道垃圾收集发生在流程层面或应用程序域级别?(Does garbage collection hap

2019-08-17 08:42发布

FullGC normaly暂停所有线程运行时。 有两个应用程序域,每个运行多个线程。 当GC运行时,将所有线程被暂停,或仅是某一方的AppDomain?

Answer 1:

很难回答做的只是测试它,最好的事情:

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主机上的所有应用程序域。 这让我很吃惊。



Answer 2:

从这个线程在这里: 在.NET中的垃圾收集系统范围或应用程序范围内? ,它发生在过程级。 在这个过程中的所有线程将被暂停,但不能跨多个进程。

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

然而,可以有太多的流程花费时间做GC不能参与GC的其他进程的性能产生负面影响会出现CPU的性能影响。

这个环节也解释了GC的基本面太:

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



文章来源: Does garbage collection happen at the process level or appdomain level?