рис. 21.15.
.Состояние.управляемой.кучи.после.второй.уборки.мусора
Мониторинг и контроль времени
жизни объектов
Для каждого домена приложения CLR поддерживает
таблицу GC-дескрипторов
(
GC handle table
), с помощью которой приложение отслеживает время жизни объекта
или позволяет управлять им вручную. В момент создания домена приложения табли-
ца пуста. Каждый элемент таблицы состоит из указателя на объект в управляемой
куче и флага, задающего способ мониторинга или контроля объекта. Приложение
добавляет в таблицу и удаляет из таблицы элементы с помощью показанного далее
типа
System.Runtime.InteropServices.GCHandle
.
598
Глава.21 .Автоматическое.управление.памятью.(уборка.мусора)
// Тип определяется в пространстве имен System.Runtime.InteropServices
public struct GCHandle {
// Статические методы, создающие элементы таблицы
public static GCHandle Alloc(object value);
public static GCHandle Alloc(object value, GCHandleType type);
// Статические методы, преобразующие GCHandle в IntPtr
public static explicit operator IntPtr(GCHandle value);
public static IntPtr ToIntPtr(GCHandle value);
// Статические методы, преобразующие IntPtr в GCHandle
public static explicit operator GCHandle(IntPtr value);
public static GCHandle FromIntPtr(IntPtr value);
// Статические методы, сравнивающие два типа GCHandles
public static Boolean operator ==(GCHandle a, GCHandle b);
public static Boolean operator !=(GCHandle a, GCHandle b);
// Экземплярный метод, освобождающий элемент таблицы (индекс равен 0)
public void Free();
// Экземплярное свойство, извлекающее/назначающее
// для элемента ссылку на объект
public object Target { get; set; }
// Экземплярное свойство, равное true при отличном от 0 индексе
public Boolean IsAllocated { get; }
// Для элементов с флагом pinned возвращается адрес объекта
public IntPtr AddrOfPinnedObject();
public override Int32 GetHashCode();
public override Boolean Equals(object o);
}
В сущности, для контроля или мониторинга времени жизни объекта вызывается
статический метод
Alloc
объекта
GCHandle
, передающий ссылку на этот объект, и тип
GCHandleType
, который представляет собой флаг, задающий способ мониторинга/
контроля объекта. Перечислимый тип
GCHandleType
определяется так:
public enum GCHandleType {
Weak = 0, // Мониторинг существования объекта
WeakTrackResurrection = 1 // Мониторинг существования объекта
Normal = 2, // Управление временем жизни объекта
Pinned = 3 // Управление временем жизни объекта
}
Вот что означают эти флаги.
Weak
— мониторинг времени жизни объекта. Флаг позволяет узнать, когда
уборщик мусора обнаруживает, что объект более недоступен коду приложения.
Учтите, что метод финализации объекта мог как выполниться, так и не выпол-
ниться, поэтому объект может по-прежнему оставаться в памяти.
Do'stlaringiz bilan baham: |