Подтвердить что ты не робот

Работает ли сборщик мусора в отдельном процессе?

Собирает ли сборщик мусора в отдельный процесс?

Например:

  • Если мы попытаемся измерить время процесса, взятое какой-то частью кода, и во время этого сборщик мусора начнет собирать, начнется ли он с нового процесса или в том же процессе?

  • Работает ли это следующим образом?

    //Code (Process 1)
    --> Garbage Collector Run (Process 1)
    //Code (Process 1)
    

    Или как это?

    //Code (Process 1)
    --> Garbage Collector Run (Process 2)
    //Code (Process 1)
    
4b9b3361

Ответ 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> элемент схемы конфигурации времени выполнения

См. Основы сбора мусора