Работает ли сборщик мусора в отдельном процессе?
Собирает ли сборщик мусора в отдельный процесс?
Например:
-
Если мы попытаемся измерить время процесса, взятое какой-то частью кода, и во время этого сборщик мусора начнет собирать, начнется ли он с нового процесса или в том же процессе?
-
Работает ли это следующим образом?
//Code (Process 1)
--> Garbage Collector Run (Process 1)
//Code (Process 1)
Или как это?
//Code (Process 1)
--> Garbage Collector Run (Process 2)
//Code (Process 1)
Ответы
Ответ 1
Сборщик мусора запускает поток, который запускает сбор мусора, в том же процессе. Он останавливает весь текущий поток и выполняет сам. Он не запускает еще один процесс, вы бы это видели в Windows.
От MSDN:
Прежде чем сбор мусора начнется, все управляемые потоки будут приостановлены, кроме потока, который вызвал сбор мусора.
(Это относится только к рабочим станциям, как указано DrKoch). Серверы имеют фоновый поток для сбора мусора.
Если вы ищете в справочной документации для "Совместная сборка мусора", вы получите текст "GC thread", который поддерживает это.
Вы можете принудительно запустить сборку гаражей в отдельном потоке, если хотите. Поместите это в свой app.config
:
<configuration>
<runtime>
<gcServer enabled="true"/>
</runtime>
</configuration>
(from этот ответ)
Также читайте В .NET Framework 4.5 включены новые сборщики мусора для клиентских и серверных приложений, как это было предложено Adam Houldsworth, об изменениях в способе работы сборщика мусора с .NET 4.5.
Ответ 2
Сначала существует различие между процессом и потоком.
Как указано в @CodesInChaos, каждый процесс имеет свое собственное пространство адреса, поэтому запуск GC в отдельном процессе не имеет смысла.
Если мы говорим о потоках:
существует разница между "рабочей станцией" и "сервером". На рабочей станции он запускается на одном из пользовательских потоков:
Сбор происходит в пользовательском потоке, который вызвал сборку мусора
На сервере он запускается в отдельных выделенных потоках:
Сбор происходит по нескольким выделенным потокам, которые работают на уровне приоритета THREAD_PRIORITY_HIGHEST.
Если ваш компьютер считается "сервером", это зависит от конфигурации:
<gcServer> элемент схемы конфигурации времени выполнения
См. Основы сбора мусора