Отправляет email-рассылки с помощью сервиса Sendsay

Изучаем .NET Framework

  Все выпуски  

Изучаем .NET Framework


Информационный Канал Subscribe.Ru


Библиотека .NET Framework. Выпуск 3.

Работа со сборщиком мусора.

.NET Framework поддерживает автоматическое управление памятью с помощью механизма сбор мусора (garbage collection). Программа не обязана явно освобождать выделенную память. CLR определяет, что память больше не используется программой и автоматически удаляет ее.

Программист создает ссылку на объект оператором new и получает ссылку на него. CLR выделяет для него память из управляемой кучи (managed heap) - части памяти процесса, зарезервированной CLR для этой надобности. С определенной частотой системный поток анализирует все объекты в управляемой куче. Объект, на который не осталось ни одной ссылки, называется мусором (garbage) и удаляется из управляемой кучи. После этого оставшиеся в управляемой куче объекты дефрагментируются, а имеющиеся у программ ссылки устанавливаются на новые адреса объектов.


Для управления процессом сборки мусора в .NET Framework существует объект System.GC.
public static void Collect() "Ручной" запуск процедуры сборки мусора
public static void WaitForPendingFinalizers() Ждет, пока сборщик мусора удалит все объекты.
public static long GetTotalMemory(bool forceFullCollection) Возвращает количество байт, занимаемое приложением. Параметр forceFullCollection указывает на то, нужно ли производить сборку мусора перед подсчетом.
public static void SuppressFinalize(object obj) Указывает сборщику мусора, что при удалении объекта obj его деструктор вызывать не надо.
public static void ReRegisterForFinalize(object obj) Указывает сборщику мусора, что при удалении объекта obj необходимо вызвать его деструктор. (Используется, если вызов деструктора был отменен)


Следующий пример демонстрирует работу сборщика мусора. Исходный текст рекомендуется просматривать при разрешении 1024x768.


using System;

//Простой объект, для изучения работы сборщика мусора

class SimpleObject

{

      public SimpleObject()

      {

            //Сигнализирует о создании объекта

            Console.WriteLine("Объект создан");

      }

      ~SimpleObject()

      {

            //Сигнализирует об удалении объекта

            Console.WriteLine("Объект удален");

      }

}

class MainClass

{

      [STAThread]

      static void Main(string[] args)

      {

            Console.WriteLine("Начало работы");

            //Создание объектов

            Console.WriteLine("{0} байт памяти занято приложением", GC.GetTotalMemory(true));

            SimpleObject obj1 = new SimpleObject();

            Console.WriteLine("{0} байт памяти занято приложением", GC.GetTotalMemory(true));

            SimpleObject obj2 = new SimpleObject();

            Console.WriteLine("{0} байт памяти занято приложением", GC.GetTotalMemory(true));

           

            //Запрет на вызов деструктора

            GC.SuppressFinalize(obj1);

            GC.SuppressFinalize(obj2);

            //Потеря ссылки на объект

            obj1 = null;

            //Вызов процесса сборки мусора

            GC.Collect();

            GC.WaitForPendingFinalizers();

            //Разрешение на вызов деструктора

            GC.ReRegisterForFinalize(obj2);

            Console.WriteLine("Конец работы");

      }

}


Результат работы программы:

Начало работы
277284 байт памяти занято приложением
Объект создан
277436 байт памяти занято приложением
Объект создан
277448 байт памяти занято приложением
Конец работы
Объект удален

Полную версию примера можно взять здесь

Сборщик мусора - достаточно непредсказуемая вещь. Невозможно сказать, когда он начнет выполняться, и в какой последовательности удаляются объекты. Однако он позволяет значительно сократить время разработки программ.
Следующий выпуск будет посвящен структурной обработке исключений.
С уважением Олег msdotnet@mail.ru.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное