Глава.21 .Автоматическое.управление.памятью.(уборка.мусора)
для домена приложений, так и для всего процесса, проверить корни, сохраняющие
объект в куче живым, и многое другое.
Освобождение ресурсов при помощи
механизма финализации
Итак, мы познакомились с азами уборки мусора и управляемой кучей, а также тем,
как уборщик мусора освобождает память объекта. К счастью, большинству типов
для работы требуется только память, но есть и типы, которым помимо памяти не-
обходимы системные ресурсы.
Например, типу
System.IO.FileStream
нужно открыть файл (системный ре-
сурс) и сохранить его дескриптор. Затем при помощи этого дескриптора методы
Read
и
Write
данного типа работают с файлом. Аналогично, тип
System.Threading.
Mutex
открывает мьютекс, являющийся объектом ядра Windows (системный ресурс),
и сохраняет его дескриптор, который использует при вызове методов объекта
Mutex
.
Если тип, использующий системный ресурс, будет уничтожен в ходе уборки му-
сора, занимаемая объектом память вернется в управляемую кучу; однако системный
ресурс, о котором уборщику мусора ничего не известно, будет потерян. Разумеется,
это нежелательно, поэтому CLR поддерживает механизм
финализации
(finalization),
позволяющий объекту выполнить корректную очистку, прежде чем уборщик мусора
освободит занятую им память. Любой тип, использующий системный ресурс (файл,
сетевое соединение, сокет, мьютекс и т. д.), должен поддерживать финализацию.
Когда CLR определяет, что объект стал недоступным, ему предоставляется возмож-
ность выполнить финализацию с освобождением всех задействованных системных
ресурсов, после чего объект будет возвращен в управляемую кучу.
Всеобщий базовый класс
System.Object
определяет защищенный виртуальный
метод с именем
Finalize
. Когда уборщик мусора определяет, что объект подлежит
уничтожению, он вызывает метод
Finalize
этого объекта (если он переопределен).
Группа проектировщиков C# из Microsoft посчитала, что метод финализации отли-
чается от остальных и требует специального синтаксиса в языке программирования
(по аналогии с тем, как в С# специальный синтаксис используется для определения
конструктора). Поэтому для определения метода финализации в С# перед именем
класса нужно добавить знак тильды (
~
):
internal sealed class SomeType {
// Метод финализации
~SomeType() {
// Код метода финализации
}
}
Скомпилировав этот код и проверив полученную сборку с помощью утилиты
ILDasm exe
, вы увидите, что компилятор С# внес в метаданные этого модуля защи-
577
Освобождение.ресурсов.при.помощи.механизма.финализации
щенный метод с именем
Finalize
. При изучении IL-кода метода
Finalize
также
становится ясно, что код в теле метода генерируется в блок
try
, а вызов метода
base.Finalize
— в блок
finally
.
Do'stlaringiz bilan baham: |