Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 22 стр.

UptoLike

мусора проводится чаще всего. Объекты, пережившие сборку мусора в по-
колении 0, переводятся в поколение 1, в котором сборка мусора осущест-
вляется реже. Объекты, не удаленные после сборки мусора в поколении 1,
переводятся в поколение 2. Сборка мусора в поколении 2 выполняется со-
всем редко.
Эффективность организации сборки мусора с поколениями обосно-
вывается тем, что молодые объекты имеют меньшее время жизни. Это ут-
верждение получено эмпирическим путем и справедливо для подавляю-
щего большинства реальных приложений.
Еще одним способом увеличения производительности сборщика му-
сора является выделение отдельной кучи для больших объектов. Больши-
ми считаются объекты, размер которых превышает 85000 байт. Куча боль-
ших объектов никогда не дефрагментируется, и все объекты в ней счита-
ются принадлежащими поколению 2.
Введение в архитектуру Microsoft .NET Framework
31
ждого метода сопоставляется набор тех регистров процессора, локальных
переменных и параметров этого метода, которые являются корнями. При
этом локальные переменные и параметры задаются своими смещениями
относительно фрейма. Таким образом, для определения полного набора
корней сборщику мусора достаточно выполнить следующие операции:
1. взять адреса всех глобальных переменных и статических полей
классов, имеющих ссылочные типы;
2. определить точки выполнения для каждого потока программы и
добавить корни, которые в таблице корней соответствуют адре-
сам этих точек;
3. просканировать стек каждого потока, обращаясь к таблице кор-
ней в точках вызова методов и добавляя полученные из таблицы
корни.
После вычисления полного набора корней сборщик мусора строит
граф достижимости объектов кучи. Входами в граф служат объекты, на ко-
торые указывают корни. Поля этих объектов, имеющие ссылочные типы,
сканируются, и в граф добавляются объекты, на которые эти поля указы-
вают. Затем сканируются поля этих добавленных объектов. Процесс по-
строения графа продолжается до тех пор, пока в него не войдут все объек-
ты, достижимые из корней. При этом информацию о полях объектов
сборщик мусора берет из метаданных, и ни один объект не рассматривает-
ся дважды.
Среди объектов, не попавших в граф достижимости, сборщик мусора
ищет такие объекты, адреса которых записаны в список завершения. Эти
адреса добавляются в очередь завершения, а сами объекты считаются дости-
жимыми и не подлежащими удалению. Методы Finalize объектов, попав-
ших в очередь завершения, выполняются затем в отдельном потоке.
Нетрудно сообразить, что эти объекты могут быть удалены только при сле-
дующей сборке мусора, и, более того, только при условии, что их методы
Finalize успели выполниться и не привели к тому, чтобы объекты стали
достижимыми из корней.
После того как определены все достижимые объекты, сборщик мусо-
ра выполняет дефрагментацию кучи. Дефрагментация заключается в
сдвиге достижимых объектов к началу кучи на место удаляемых недости-
жимых объектов. При этом сборщику мусора приходится корректировать
поля объектов и корни.
1.4.3. Основные приемы повышения
эффективности сборки мусора
Проведение сборки мусора только для части объектов кучи позволя-
ет существенно сократить время работы сборщика. Поэтому все объекты
делятся на три категории, называемые поколениями. В поколении 0 сборка
30
CIL и системное программирование в Microsoft .NET
30                          CIL и системное программирование в Microsoft .NET   Введение в архитектуру Microsoft .NET Framework                     31


ждого метода сопоставляется набор тех регистров процессора, локальных           мусора проводится чаще всего. Объекты, пережившие сборку мусора в по-
переменных и параметров этого метода, которые являются корнями. При             колении 0, переводятся в поколение 1, в котором сборка мусора осущест-
этом локальные переменные и параметры задаются своими смещениями                вляется реже. Объекты, не удаленные после сборки мусора в поколении 1,
относительно фрейма. Таким образом, для определения полного набора              переводятся в поколение 2. Сборка мусора в поколении 2 выполняется со-
корней сборщику мусора достаточно выполнить следующие операции:                 всем редко.
        1. взять адреса всех глобальных переменных и статических полей               Эффективность организации сборки мусора с поколениями обосно-
           классов, имеющих ссылочные типы;                                     вывается тем, что молодые объекты имеют меньшее время жизни. Это ут-
        2. определить точки выполнения для каждого потока программы и           верждение получено эмпирическим путем и справедливо для подавляю-
           добавить корни, которые в таблице корней соответствуют адре-         щего большинства реальных приложений.
           сам этих точек;                                                           Еще одним способом увеличения производительности сборщика му-
        3. просканировать стек каждого потока, обращаясь к таблице кор-         сора является выделение отдельной кучи для больших объектов. Больши-
           ней в точках вызова методов и добавляя полученные из таблицы         ми считаются объекты, размер которых превышает 85000 байт. Куча боль-
           корни.                                                               ших объектов никогда не дефрагментируется, и все объекты в ней счита-
     После вычисления полного набора корней сборщик мусора строит               ются принадлежащими поколению 2.
граф достижимости объектов кучи. Входами в граф служат объекты, на ко-
торые указывают корни. Поля этих объектов, имеющие ссылочные типы,
сканируются, и в граф добавляются объекты, на которые эти поля указы-
вают. Затем сканируются поля этих добавленных объектов. Процесс по-
строения графа продолжается до тех пор, пока в него не войдут все объек-
ты, достижимые из корней. При этом информацию о полях объектов
сборщик мусора берет из метаданных, и ни один объект не рассматривает-
ся дважды.
     Среди объектов, не попавших в граф достижимости, сборщик мусора
ищет такие объекты, адреса которых записаны в список завершения. Эти
адреса добавляются в очередь завершения, а сами объекты считаются дости-
жимыми и не подлежащими удалению. Методы Finalize объектов, попав-
ших в очередь завершения, выполняются затем в отдельном потоке.
Нетрудно сообразить, что эти объекты могут быть удалены только при сле-
дующей сборке мусора, и, более того, только при условии, что их методы
Finalize успели выполниться и не привели к тому, чтобы объекты стали
достижимыми из корней.
     После того как определены все достижимые объекты, сборщик мусо-
ра выполняет дефрагментацию кучи. Дефрагментация заключается в
сдвиге достижимых объектов к началу кучи на место удаляемых недости-
жимых объектов. При этом сборщику мусора приходится корректировать
поля объектов и корни.
1.4.3. Основные приемы повышения
эффективности сборки мусора
     Проведение сборки мусора только для части объектов кучи позволя-
ет существенно сократить время работы сборщика. Поэтому все объекты
делятся на три категории, называемые поколениями. В поколении 0 сборка