ВниМание
Это.весьма.упрощенное.описание.работы.уборщика.мусора .В.действительности.
уборка.мусора.выполняется.при.заполнении.поколения.0 .Подробнее.о.поколениях.
мы.поговорим.чуть.позже,.а.пока.для.простоты.будем.считать,.что.уборка.мусора.
происходит.при.заполнении.кучи
Для управления сроком жизни объектов в некоторых системах используется
алгоритм подсчета ссылок. Например, он используется в модели Microsoft COM
(Component Object Model). В системах с подсчетом ссылок каждый объект в куче
содержит внутреннее поле с информацией о том, сколько «частей» программы в на-
стоящее время используют данный объект. Когда каждая «часть» переходит к точке
кода, в которой объект становится недоступным, она уменьшает поле счетчика
объекта. Когда значение счетчика уменьшается до 0, объект удаляется из памяти.
К сожалению, в системах с подсчетом ссылок возникают серьезные проблемы
с циклическими ссылками. Например, в графическом приложении окно содержит
ссылку на дочерний элемент пользовательского интерфейса, а дочерний элемент
пользовательского интерфейса содержит ссылку на свое родительское окно. Эти
ссылки не позволяют счетчикам двух объектов уменьшиться до 0, поэтому оба объ-
екта остаются в памяти даже тогда, когда окно перестало быть нужным приложению.
Из-за проблем с алгоритмами, основанными на подсчете ссылок, CLR вместо
этого использует алгоритм
отслеживания ссылок
. Алгоритм отслеживания ссылок
работает только с переменными ссылочного типа, потому что только эти переменные
могут ссылаться на объекты в куче; переменные значимых типов просто содержат
данные экземпляра значимого типа. Ссылочные переменные могут использовать-
ся во многих контекстах: статические и экземплярные поля классов, аргументы
методов, локальные переменные. Все переменные ссылочных типов называются
корнями
(roots).
Когда среда CLR запускает уборку мусора, она сначала приостанавливает все
программные потоки в процессе. Тем самым предотвращается обращение к объектам
и возможное изменение состояния во время их анализа CLR. Затем CLR перехо-
дит к этапу уборки мусора, называемому
маркировкой
(marking). CLR перебирает
все объекты в куче, задавая биту в поле индекса блока синхронизации значение 0.
Это означает, что все эти объекты могут быть удалены. Затем CLR проверяет все
активные корни и объекты, на которые они ссылаются. Если корень содержит
null
,
CLR игнорирует его и переходит к следующему корню.
Если корень ссылается на объект, в поле индекса блока синхронизации устанав-
ливается бит — это и есть признак маркировки объекта. После маркировки объекта
558
Do'stlaringiz bilan baham: |