Библиотека книг по компьютерным технологиям
⇒ ⇒ Разработка Windows-приложений на Microsoft Visual Basic .NET и Microsoft Visual C# .NET. Учебный курс MCAD/MCSD
⇒ ⇒ ⇒ Глава 1. Введение в .NET Framework

Читать далее: Циклические ссылки

Занятие 6. Сбор мусора

Схема автоматического управления памятью, применяемая в .NET Framework, получила название сбор мусора (garbage collection). Этот механизм позволяет отслеживать неиспользуемые объекты и освобождать занятую ими память совершенно без участия приложения. На этом занятии вы узнаете, как работает механизм сбора мусора.

Изучив материал этого занятия, вы сможете:

Продолжительность занятия — около 15 минут.

В .NET Framework применяется автоматическое управление памятью, то есть .NET Framework автоматически утилизирует память неиспользуемых объектов. Этот процесс называется сбором мусора. Рассмотрим следующий пример:

Visual Basic .NET

Sub GarbageCollectionExample1()
  Dim myWidget As New Widget
End Sub

Visual C#

void GarbageCollectionExample1()
{
  Widget myWidget = new Widget();
}

Когда эта процедура завершится, переменная myWidget выйдет из области видимости, после чего на нее не будет ссылаться ни одна из переменных приложения. Сборщик мусора непрерывно проверяет дерево ссылок в фоновом режиме и определяет объекты, на которые больше нет ссылок. Обнаружив такой объект (например, myWidget из нашего примера), сборщик мусора удаляет его и освобождает занятую им память.

Поскольку сбор мусора работает постоянно, не обязательно явно уничтожать объекты, как только они станут ненужными. Обычно сборщик мусора работает в низкоприоритетном потоке, который исполняется, пока процессор не занят более важными задачами, но при дефиците памяти приоритет этого потока повышается. В результате память освобождается быстрее, пока не исчезнет ее дефицит, тогда приоритет потока сборщика мусора вновь снижается.

Подобный подход к освобождению памяти, получивший название недетерминированного, призван обеспечить максимальную производительность приложений и предоставить им окружение, более устойчивое к ошибкам. Однако за эти удобства приходится расплачиваться неопределенностью. Невозможно с уверенностью сказать, когда именно будет уничтожен тот или иной объект, то есть нельзя контролировать момент вызова деструктора класса (в C#) или метода Visual Basic .NET, подготавливающего объекты к уничтожению. В силу этих причин в деструкторе не должно быть кода, который необходимо исполнить в заданное время. Классы, удерживающие дефицитные ресурсы, обычно вызывают метод Dispose(), гарантированно освобождающий эти ресурсы, как только объект становится ненужным.

Google
 
Рейтинг@Mail.ru
Сайт управляется системой uCoz