Windows сообщает о нехватке памяти.
CLR использует функции Win32
Cre-
ateMemoryResourceNotification
и
QueryMemoryResourceNotification
для
569
Поколения
контроля состояния памяти системы. Если Windows сообщает о недостаточном
объеме свободной памяти, CLR запускает уборку мусора, чтобы избавиться от
неиспользуемых объектов и сократить размер рабочего набора процесса.
Выгрузка домена приложения.
При выгрузке домена приложения CLR вы-
полняет полную уборку мусора для всех поколений. Домены приложений рас-
сматриваются в главе 22.
Завершение работы CLR.
CLR завершает работу при нормальном завер-
шении процесса (по сравнению, например, с внешним завершением работы
из Диспетчера задач). Во время заверения CLR считает, что в процессе нет
корневых ссылок; объектам предоставляется возможность выполнить очистку,
но CLR не пытается дефрагментировать или освобождать память, потому
что после завершения всего процесса Windows автоматически освобождает
всю его память.
Большие объекты
Существует еще один путь повышения быстродействия, о котором стоит рассказать.
CLR делит объекты на малые и большие. До настоящего момента рассматривались
только малые объекты. Любые объекты размером 85 000 байт и более считаются
большими
1
. CLR работает с большими объектами по несколько отличающимся
правилам:
Память для них выделяется в отдельной части адресного пространства процесса.
К большим объектам не применяется сжатие, так как на их перемещение в памяти
потребуется слишком много процессорного времени. Возможная фрагментация
адресного пространства между большими объектами может привести к выдаче
исключения
OutOfMemoryException
. В будущих версиях CLR большие объекты
могут участвовать в сжатии.
Большие объекты всегда считаются частью поколения 2, поэтому их следует
создавать лишь для ресурсов, которые должны жить долго. Размещение в памяти
короткоживущих больших объектов приведет к необходимости частой уборки
мусора в поколении 2, что снижает производительность. Обычно в больших
объектах хранятся большие строки (например, XML или JSON) или массивы
байтов, используемые в операциях ввода/вывода — например, при чтении данных
из файла или сети в буфер для последующей обработки.
Все эти механизмы абсолютно прозрачны для разработчика. Вы можете просто
забыть об их существовании до тех пор, пока в программе не возникнет какая-нибудь
аномальная ситуация (например, фрагментация адресного пространства).
1
В будущем пороговый размер объекта, при котором он считается большим, может быть
изменен. Не следует считать значение 85 000 константой.
Do'stlaringiz bilan baham: |