Сборка мусора рабочей станции и сборка мусора сервера
Сборщик мусора является самонастраивающимся и может работать в широком диапазоне сценариев. Но вы можете задать тип сборки мусора на основе характеристик рабочей нагрузки. Среда CLR предоставляет следующие виды сборки мусора.
Сборка мусора на рабочей станции выполняется для клиентских приложений. Это вариант по умолчанию для автономных приложений. Для размещенных приложений, например размещаемых в ASP.NET, разновидность сборки мусора по умолчанию определяется узлом.
Сборка мусора рабочей станции может быть параллельной или непараллельной. Параллельная (или фоновая) сборка мусора позволяет управляемым потокам продолжать операции во время этого процесса. В .NET Framework 4 и более поздних версиях фоновая сборка мусора заменяет параллельную сборку мусора.
Сборка мусора сервера, предназначенная для серверных приложений, которым нужны высокое быстродействие и масштабируемость.
В .NET Core серверная сборка мусора может быть непараллельной или фоновой.
В .NET Framework 4.5 и более поздних версий сборка мусора на сервере может быть непараллельной или фоновой. В .NET Framework 4 и более ранних версиях серверная сборка мусора является непараллельной.
На рисунке ниже показаны выделенные потоки, выполняющие сборку мусора на сервере.
Замечания, связанные с быстродействием
Сборщик мусора рабочей станции
Ниже приведены замечания по сборке мусора рабочей станции, касающиеся потоков и производительности.
Сборка выполняется для пользовательского потока, запустившего сборку мусора, и сохраняет тот же приоритет. Так как пользовательские потоки обычно выполняются с обычным приоритетом, сборщик мусора (выполняемый для потока с обычным приоритетом) должен конкурировать с другими потоками за время процессора. (Потоки, выполняющие машинный код, не приостанавливаются ни при серверной сборке мусора, ни при сборке мусора рабочей станции.)
Сборка мусора рабочей станции всегда используется на компьютере с одним логическим ЦП независимо от параметра конфигурации.
Сборщик мусора сервера
Ниже приведены замечания по сборке мусора сервера, касающиеся потоков и производительности.
Коллекция выполняется в нескольких выделенных потоках. В Windows эти потоки выполняются на
THREAD_PRIORITY_HIGHEST
уровне приоритета.Куча и выделенный поток для выполнения сборки мусора предоставляются для каждого логического ЦП, а куча собирается одновременно. Каждая куча содержит кучу небольших объектов и кучу больших объектов, и все кучи доступны из пользовательского кода. Объекты из различных куч могут ссылаться друг на друга.
Так как несколько потоков сборки мусора работают совместно, для кучи одного и того же размера сборка мусора сервера выполняется быстрее сборки мусора рабочей станции.
В сборке мусора сервера часто используются сегменты большего размера. Однако это только обобщение: размер сегмента зависит от реализации и может изменяться. При настройке приложения не делайте предположений относительно размера сегментов, выделенных сборщиком мусора.
Сборка мусора сервера может оказаться ресурсоемкой операцией. Например, представьте, что существует 12 процессов, использующих серверную сборку данных, запущенную на компьютере с четырьмя логическими ЦП. Если все процессы собирают мусор одновременно, они будут вмешиваться друг в друга, так как на одном и том же логическом ЦП запланировано 12 потоков. Если процессы активны, использовать серверную сборку мусора для всех них не рекомендуется.
При запуске сотен экземпляров приложения рассмотрите возможность использования сборки мусора рабочей станции с отключенной параллельной сборкой мусора. Это уменьшит число переключений контекста, что может повысить быстродействие.