У всех трех поколений сборки мусора есть очередь финализаторов в .NET? - PullRequest
3 голосов
/ 15 февраля 2012

У всех трех поколений в .NET GC есть очередь финализатора, или у поколения 2 только она? Я предполагаю, что только Поколение 2 имеет очередь финализатора и f-достижимую очередь, связанную с ним.

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Есть одна очередь. Вы можете просмотреть его с помощью SOS: http://blogs.msdn.com/b/tess/archive/2007/10/19/net-finalizer-memory-leak-debugging-with-sos-dll-in-visual-studio.aspx

2 голосов
/ 15 февраля 2012

Это трудно объяснить, фактический код CLR не очень хорошо соответствует описаниям, которые вы найдете в литературе .NET, и он довольно запутанный. Внутри CLR действительно есть одна логическая структура с именем «finalization_queue». Однако он имеет внутреннюю структуру, которая организует финализуемые объекты по поколениям.

Есть лучший способ показать это. Если ваше предположение верно, не будет никакого способа, чтобы объект мог быть завершен после коллекции # 0 поколения. Попробуйте:

using System;

class Program {
    static void Main(string[] args) {
        var obj = new Test();
        obj = null;
        Console.WriteLine("before gen#0 collection");
        GC.Collect(0);
        GC.WaitForPendingFinalizers();
        Console.WriteLine("after gen#0 collection");
        Console.ReadLine();
    }
}

class Test {
    ~Test() { Console.WriteLine("finalized"); }
}
...