.net 垃圾收集是在进程级别还是在appdomain级别进行的?

.net 垃圾收集是在进程级别还是在appdomain级别进行的?,.net,garbage-collection,.net,Garbage Collection,FullGC在运行时正常暂停所有线程。有两个AppDomain,每个AppDomain运行多个线程。当GC运行时,是暂停所有线程,还是只暂停其中一个AppDomain的线程?从这个线程这里:,它发生在进程级别。该进程中的所有线程都将暂停,但不会跨多个进程暂停 一个进程中可以存在一个或多个应用程序域,但进程之间不共享应用程序域。Per:,“进程中的所有appdomains共享相同的GC。”因此,触发GC时,GC应影响所有应用程序域 但是,如果有太多进程花费时间执行GC,则可能会影响CPU性能,这可

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

从这个线程这里:,它发生在进程级别。该进程中的所有线程都将暂停,但不会跨多个进程暂停

一个进程中可以存在一个或多个应用程序域,但进程之间不共享应用程序域。Per:,“进程中的所有appdomains共享相同的GC。”因此,触发GC时,GC应影响所有应用程序域

但是,如果有太多进程花费时间执行GC,则可能会影响CPU性能,这可能会对GC中未涉及的其他进程的性能产生负面影响

此链接还解释了GC的基本原理:


很难回答,最好的办法就是测试一下:

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

GC影响默认CLR主机上所有AppDomains的良好证据。这让我很惊讶。

您确定每个AppDomain都有自己的堆吗?这与Brian Rasmussen在这里的回答相矛盾:Aghilas Yakoub在这里的回答是:“AppDomains是同一进程的一部分,因此实际上共享同一个托管堆”。这和你说的不矛盾吗?另请参阅我对我的评论的编辑,Aghilas说“你有一个进程的堆,应用程序域共享这个堆。”除非我有误解,否则看起来至少有一个答案(你的或他们的)需要更正。好的,我会降低语气。它们在逻辑上是不同的,因为对象句柄指向特定于AppDomain的数据结构。因此需要跨域封送。但是测试中确实有证据表明GC堆本身是共享的。@TimGoodman注意到.NET同时管理许多不同的托管堆,即使是在同一个
AppDomain
中。这在使用服务器GC时尤其明显,每个线程都可以有自己的堆。但是,GC仍然必须检查所有这些文件,因为它们可以有交叉引用。
In appdomain 'test', collection count = 3, gen = 2
Primary appdomain, collection count = 3, gen = 2