Читайте также:
|
|
Сборка мусора - это механизм, позволяющий компьютеру определить, когда объект более недоступен. Тогда он автоматически освобождает память, используемую этим объектом (вызывая функцию finalizer, реализованную пользователем). Некоторые сборщики мусора (в т.ч. используемый в.NET), "сжимают" память, уменьшая количество ресурсов, используемых вашей программой. До настоящего времени на платформе Windows использовалось две технологии освобождения памяти, выделенной системой по динамическим запросам:
Возложение этой задачи на код приложения.
Поддержка счетчиков ссылок на обьекты.
Возложение ответственности за освобождение памяти на код приложения - это техника, используемая низкоуровневыми высокопроизводительными языками, такими как С++. Это эффективно и обладает тем преимуществом, что ресурсы никогда не бывают заняты дольше, чем это необходимо. Однако большой недостаток такого подхода состоит в том, что он часто порождает ошибки. Код, запрашивающий память, также обязан явно информировать систему, когда он перестает в ней нуждаться. Однако об этом очень легко забыть, что приводит к утечкам памяти.
Хотя современные среды разработки представляют инструменты, помогающие обнаружить такие утечки, все же они пропускают ошибки, которые очень трудно отследить, поскольку они никак не проявляются до тех пор, пока не утечет так много памяти, что Windows откажет процессу в выделенной новой. И в такой момент весь компьютер начнет заметно "тормозить" при каждом обращении памяти.
Вместо всего этого.NET полагаеся на сборщик мусора. Это программа, предназначенная для того, чтобы очищать память. Идея состоит в том, что вся динамически выделяемая память распределяется в области кучи (это верно для всех языков, хотя в случае.NET CLR поддерживает свою собственную управляемую кучу для использования приложениями.NET). Всякий раз когда.NET обнаруживает, что управляемая куча данного процесса заполнилась и нуждается в приведении в порядок, он вызывает сборщик мусора. Этот сборщик мусора проходит по всем переменным, находящимся в контексте вашего кода, и проверяет ссылки на обьекты, расположенные в области кучи, чтобы идентифицировать, какие из них доступны из кода, то есть, чтобы узнать, на какие обьекты существуют ссылки. Любой обьект с отсутствием ссылок рассматривается как такой, к которому больше не будет осуществляться доступ из кода, потому обьект может быть удален.
Механизм сборки мусора невозможно применить с таким языком, как например неуправляемый С++, потому что С++ допускает свободное приведение указателей к другим типам.
Одно важное свойство сборки мусора заключается в том, что это недетерминированный процесс. Другими словами, вы не можете знать, когда будет вызван сборщик мусора; он будет вызван тогда, когда CLR решит, что в этом есть необходимость, хотя также можно перекрыть этот процесс и вызвать сборщик мусора из вашего приложения.
Дата добавления: 2015-01-30; просмотров: 120 | Поможем написать вашу работу | Нарушение авторских прав |