570
Глава.21 .Автоматическое.управление.памятью.(уборка.мусора)
режимы уборки мусора
При запуске CLR выбирается один из режимов уборки мусора, который не может
быть изменен до завершения процесса. Существует два основных режима уборки
мусора:
Режим рабочей станции.
Этот режим настраивает уборку мусора для при-
ложений на стороне клиента. Он оптимизирован для минимизации времени
приостановки потоков приложения, чтобы не раздражать пользователя. Уборщик
предполагает, что на компьютере работают другие приложения, и старается не
занимать слишком много ресурсов процессора.
Режим сервера.
Этот режим оптимизирует уборку мусора для приложений на
стороне сервера. Уборщик предполагает, что на машине не запущено никаких
сторонних приложений (клиентских или серверных), поэтому все ресурсы про-
цессора можно бросить на уборку мусора. В этом режиме управляемая куча раз-
бирается на несколько разделов — по одному на процессор. Изначально уборщик
мусора использует один поток на один процессор. Каждый поток выполняется
в собственном разделе одновременно с другими потоками. Такой подход хорошо
работает в случае приложений с единообразным поведением рабочих потоков.
Функция работает на компьютерах с несколькими процессорами; только в этом
случае параллельная обработка потоков позволяет получить прирост произво-
дительности.
По умолчанию приложения запускаются в режиме рабочей станции с включен-
ным режимом параллельной уборки мусора. А серверные приложения (например,
ASP.NET или SQL Server), обеспечивающие хостинг CLR, могут потребовать за-
грузки режима сервера. Однако если серверное приложение запускается на одно-
процессорной машине, CLR всегда использует режим рабочей станции. Автономное
приложение может приказать CLR использовать серверный уборщик мусора путем
создания конфигурационного файла (о том, как это сделать, рассказывалось в гла-
вах 2 и 3), содержащего элемент
gcServer
. Вот пример конфигурационного файла:
Узнать, запущена ли среда CLR в серверном GC-режиме, можно при помощи
логического свойства
IsServerGC
класса
GCSettings
, предназначенного только
для чтения:
using System;
using System.Runtime; // GCSettings находится в этом пространстве имен
571
Поколения
public static class Program {
public static void Main() {
Console.WriteLine(
"Application is running with server GC=" + GCSettings.IsServerGC);
}
}
Кроме двух основных режимов, у уборщика мусора существует два подрежима:
параллельный (используемый по умолчанию) и непараллельный. В параллельном
режиме у уборщика мусора есть дополнительный фоновый поток, выполняющий
пометку объектов во время работы приложения. Когда поток размещает в памя-
ти объект, вызывающий превышение порога для поколения 0, уборщик сначала
приостанавливает все потоки, а затем определяет поколения, в которых нужно
выполнить уборку мусора. Если уборщик должен собрать мусор в поколении 0
или 1, он работает как обычно, но если нужно собрать мусор в поколении 2, раз-
мер поколения 0 увеличивается выше порогового, чтобы разместить новый объект,
а затем исполнение потоков приложения возобновляется.
Пока работают потоки приложения, отдельный поток уборщика с нормальным
приоритетом находит все недоступные объекты в фоновом режиме. После того
как объекты будут обнаружены, уборщик приостанавливает все потоки и решает,
нужно ли дефрагментировать память. Если он принимает положительное решение,
память дефрагментируется, ссылки корней исправляются, а исполнение потоков
приложения возобновляется — такая уборка мусора обычно проходит быстрее,
так как перечень недоступных объектов создается заранее. Однако уборщик мо-
жет отказаться от дефрагментации памяти, что, на самом деле, предпочтительнее.
Если свободной памяти много, уборщик не станет дефрагментировать кучу — это
повышает быстродействие, но увеличивает рабочий набор приложения. Прибегая
к параллельной уборке мусора, приложение обычно расходует больше памяти, чем
при непараллельной уборке.
Можно запретить CLR использовать режим параллельной уборки мусора,
создав конфигурационный файл приложения, содержащий элемент
gcConcurrent
(см. главы 2 и 3). Вот пример такого файла:
Хотя конфигурация GC-режима не может быть изменена до завершения про-
цесса, приложение может контролировать уборку мусора при помощи свойства
GCLatencyMode
класса
GCSettings
. Этому свойству могут присваиваться любые
значения из перечисления
GCLatencyMode
. Варианты перечислены в табл. 21.1.
Do'stlaringiz bilan baham: |