Достижимая таблица финализации - PullRequest
0 голосов
/ 19 июля 2009

Если я реализую деструктор в классе, Foo, экземпляры Foo отслеживаются в очереди завершения. Когда экземпляр Foo является сборщиком мусора, я понимаю, что CLR видит запись в очереди финализации и предоставляет этому объекту специальную обработку, перемещая объект из кучи в таблицу достижимости финализации. Тогда ... больше ничего не происходит для этого цикла сбора мусора?

Будет ли finalize () всегда вызываться во время следующего цикла сборки мусора?

Почему finalize не вызывается сразу после копирования моего объекта в таблицу для свободного доступа? (это кажется лишней сложностью)

1 Ответ

1 голос
/ 19 июля 2009

Очередь финализатора существует для упрощения вещей; было бы сложнее без него. Когда GC работает, управляемый код не должен выполняться, иначе весь анализ, выполненный GC, может оказаться недействительным, если пользовательский код выполняется посередине.

Таким образом, когда GC запускается, финализация должна быть отложена, а не выполняться сразу. Запуск его в отдельном потоке минимизирует время, когда виртуальной машине требуется эксклюзивный доступ ко всем потокам, и увеличивает вероятность одновременных действий.

...