Это просто обоснованное предположение, точные подробности коллекционера нигде не доступны.Версия CLR с общим исходным кодом не имеет положительных героев.
Как указано в блоге, одновременная коллекция происходит только во время коллекции второго поколения, которая может кусаться, потому что нет разумного верхнего предела числаобъектов, которые могут быть в этом поколении.И может заметно повлиять на отзывчивость приложения с графическим интерфейсом на рабочей станции.Gen # 0 и # 1 уже собраны, оставляя приличный кусок памяти для выделения.Он может запустить граф объектов №2, которые он обнаружил при сборе 0 и 1.
Я думаю, что GC сначала приостанавливает все потоки, чтобы он мог безопасно обходить их стек и регистры ЦП, чтобы найти ссылки на объекты.Это может произойти довольно быстро.И добавляет их к графику.
Теперь он может освобождать потоки, они могут продолжать работать, не опасаясь, что ссылки на объекты станут недействительными, потому что еще ничего не перемещается.Распределение от поколения # 0 не проблема, возможно это может даже собрать # 0, если это заполняется.В сообщении блога говорится, что это так.
Тем временем, сборщик может пройти поколение №2 и добавить ссылки на график из объектов, находящихся там.И узнайте, на какие объекты больше нет ссылок.Потоки работают, пока это происходит.Если нижние поколения не заполнятся, то поток, который выделяет, запускается в блокировку.
Затем ему нужно снова приостановить потоки, чтобы он мог уплотнить поколение # 2, перемещая объекты и обновляя их ссылки.Количество времени, которое может занять довольно непредсказуемо.Я не понимаю, будет ли он перемещать гигабайт объектов, чтобы заполнить дыру в 16 байт, которая стала свободной в начале кучи.Я серьезно сомневаюсь, что это занимает всего 200 мсек.
Одним из следствий этой теории является то, что она не будет выпускать объекты поколения № 2, на которые не ссылались во время работы потоков во время сбора.Это может быть способ проверить эту теорию, хотя я не вижу хорошего способа сделать это.