Если объект в куче больших объектов ссылается на небольшие объекты, это должно предотвратить их сборку мусора до GC 2 поколения? - PullRequest
1 голос
/ 24 сентября 2019

Мое приложение .NET Core 2.1, работающее в Windows x64, выделяет большие массивы структур, каждая структура содержит класс в поле.Массивы попадают в кучу больших объектов, поэтому они не собираются до полного (поколения 2) GC.Это было ожидаемо.Что меня удивило, так это то, что классы, на которые ссылаются структуры, также не получают GCed до GC 2-го поколения.Это ожидаемое поведение?

Нечто подобное происходит, если у меня также большой HashSet, потому что внутренне HashSet хранит массив HashSet.Slot - struct.

Некоторый код, который воспроизводитпроблема:

    class MyClass
    {
        public long Value;

        ~MyClass()
        {
            if (Value < 10)
            {
                Console.WriteLine("MyClass finalizer " + Value);
            }
        }
    }

    struct TheEntry
    {
        public MyClass TheClass;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var wr = AllocateSomeStuff();
            Console.WriteLine("Before GC MyClass is in gen " + GC.GetGeneration(wr));

            GC.Collect(1);
            Console.WriteLine("GC done");
            GC.WaitForPendingFinalizers();
            Console.WriteLine("Finalizers done");
            Console.WriteLine("After GC MyClass is in gen " + GC.GetGeneration(wr));
        }

        private static WeakReference<MyClass> AllocateSomeStuff()
        {
            var array = new TheEntry[11000];

            for (int i = 0; i < array.Length; ++i)
            {
                array[i].TheClass = new MyClass { Value = i };
            }

            return new WeakReference<MyClass>(array[0].TheClass);
        }
    }

Когда я запускаю это с массивом из 11 000 элементов в 64-битной системе (так что он превышает 85 КБ для LOH), финализаторы для MyClass не запускаются.Вывод:

Before GC MyClass is in gen 0
GC done
Finalizers done
After GC MyClass is in gen 1

С 10 000 элементов они работают.Полагаю, я ожидал, что среда выполнения GC MyClass недоступна, хотя на нее все еще ссылается другой недоступный объект.Это как это должно работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...