Подтвердить что ты не робот

Собирает ли сбор мусора на уровне процесса или уровне приложения?

FullGC normaly приостанавливает работу всех потоков во время работы. Имея два AppDomains, каждый из которых запускает несколько потоков. Когда GC запускается, будут ли приостановлены все потоки или только те из одного AppDomain?

4b9b3361

Ответ 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 влияет на все AppDomains на хосте CLR по умолчанию. Это меня удивило.

Ответ 2

Из этой темы здесь: Является сборщиком мусора в .net общесистемном или общесистемном?, он встречается на уровне процесса. Все потоки в этом процессе будут приостановлены, но не через несколько процессов.

Один или несколько доменов приложений могут существовать в процессе, но домены приложений не разделяются между процессами. Per: 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.

Эта ссылка также объясняет основы GC также:

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