Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP Part 3.DOC
Скачиваний:
42
Добавлен:
11.05.2015
Размер:
360.45 Кб
Скачать
  1. Сборка мусора в среде .Net. Построение графа достижимых объектов.

Сборка мусора - это механизм, позволяющий компьютеру определить, когда объект более недоступен. Тогда он автоматически освобождает память, используемую этим объектом (вызывая функцию finalizer, реализованную пользователем). Некоторые сборщики мусора (в т.ч. используемый в .NET), "сжимают" память, уменьшая количество ресурсов, используемых вашей программой. До настоящего времени на платформе Windows использовалось две технологии освобождения памяти, выделенной системой по динамическим запросам:

Возложение этой задачи на код приложения.

Поддержка счетчиков ссылок на обьекты.

Возложение ответственности за освобождение памяти на код приложения - это техника, используемая низкоуровневыми высокопроизводительными языками, такими как С++. Это эффективно и обладает тем преимуществом, что ресурсы никогда не бывают заняты дольше, чем это необходимо. Однако большой недостаток такого подхода состоит в том, что он часто порождает ошибки. Код, запрашивающий память, также обязан явно информировать систему, когда он перестает в ней нуждаться. Однако об этом очень легко забыть, что приводит к утечкам памяти.

Хотя современные среды разработки представляют инструменты, помогающие обнаружить такие утечки, все же они пропускают ошибки, которые очень трудно отследить, поскольку они никак не проявляются до тех пор, пока не утечет так много памяти, что Windows откажет процессу в выделенной новой. И в такой момент весь компьютер начнет заметно "тормозить" при каждом обращении памяти.

Вместо всего этого .NET полагаеся на сборщик мусора. Это программа, предназначенная для того, чтобы очищать память. Идея состоит в том, что вся динамически выделяемая память распределяется в области кучи (это верно для всех языков, хотя в случае .NET CLR поддерживает свою собственную управляемую кучу для использования приложениями .NET). Всякий раз когда .NET обнаруживает, что управляемая куча данного процесса заполнилась и нуждается в приведении в порядок, он вызывает сборщик мусора. Этот сборщик мусора проходит по всем переменным, находящимся в контексте вашего кода, и проверяет ссылки на обьекты, расположенные в области кучи, чтобы идентифицировать, какие из них доступны из кода, то есть, чтобы узнать, на какие обьекты существуют ссылки. Любой обьект с отсутствием ссылок рассматривается как такой, к которому больше не будет осуществляться доступ из кода, потому обьект может быть удален.

Механизм сборки мусора невозможно применить с таким языком, как например неуправляемый С++, потому что С++ допускает свободное приведение указателей к другим типам.

Одно важное свойство сборки мусора заключается в том, что это недетерминированный процесс. Другими словами, вы не можете знать, когда будет вызван сборщик мусора; он будет вызван тогда, когда CLR решит, что в этом есть необходимость, хотя также можно перекрыть этот процесс и вызвать сборщик мусора из вашего приложения.

  1. Сборка мусора в среде .Net. Механизм поколений объектов.

Как говорилось в начале этой главы, поколения — это механизм сборщика мусо­ра в CLR, единственное назначение которого — повышение производительности приложения. Сборщик мусора с поддержкой поколений (generational garbage collec­tor) работает на основе следую­щих предположений:

■ чем младше объект, тем короче его время жизни;

■ чем старше объект, тем длиннее его время жизни;

■ сбор мусора в части кучи выполняется быстрее, чем во всей куче.

Сразу после инициализации в управляемой куче нет объектов. Говорят, что создаваемые в куче объекты составляют поколение 0. Проще говоря, объекты поколения 0 — это только что созданные объекты, которых не касался сборщик мусора.

Объекты, пережившие сбор мусора становятся объектами поколения 1. После сбора мусора в 1 – становятся 2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]