Runtime: Параллельный сборщик мусора не может работать одновременно

Созданный на 9 авг. 2019  ·  3Комментарии  ·  Источник: dotnet/runtime

Я вижу случайную проблему в netcore 2.2, когда параллельный сборщик мусора Gen2 не запускается в фоновом потоке сборщика мусора, а не запускается в потоке, запустившем сбор.

Это наблюдалось при моей разработке для Windows 10, когда я запускал приложение в конфигурации Release в 64-разрядной среде выполнения .NET Core 2.2 с профилем GC по умолчанию (рабочая станция, включен параллельный сборщик мусора, интерактивный режим задержки), и я смог получить образец perfview. возникновения:

blockingConcurrentGC

Просматривая исходный код GC, я думаю, что в этом коммите может быть проблема. Перед изменением bgc_thread будет установлен во время создания потока и гарантированно будет установлен к моменту его проверки в void gc_heap::garbage_collect (int n) . После изменения bgc_thread теперь устанавливается в новом потоке в начале его выполнения, что, похоже, приведет к возникновению состояния гонки, когда это поле может не быть установлено вовремя для продолжения параллельного GC.

area-GC-coreclr question

Самый полезный комментарий

просто хотел указать, что фактический сборщик мусора, сделанный здесь, больше не является BGC - он просто обрабатывает его, поскольку мы не смогли создать поток BGC, поэтому мы просто выполняем полную блокировку сборки мусора; событие вводит в заблуждение (он по-прежнему говорит «Фон»), так что это также должно быть исправлено на случай, если мы не сможем фактически выполнить BGC (не удалось создать поток BGC или по любой другой причине).

Все 3 Комментарий

ааа, хорошая находка!
@PeterSolMS , @VSadov не

просто хотел указать, что фактический сборщик мусора, сделанный здесь, больше не является BGC - он просто обрабатывает его, поскольку мы не смогли создать поток BGC, поэтому мы просто выполняем полную блокировку сборки мусора; событие вводит в заблуждение (он по-прежнему говорит «Фон»), так что это также должно быть исправлено на случай, если мы не сможем фактически выполнить BGC (не удалось создать поток BGC или по любой другой причине).

для гонки установки bgc_thread нам на самом деле не нужно устанавливать его в bgc_thread_stub , в CreateSuspendableThread после этой строки

args.Thread = SetupUnstartedThread(FALSE);

объект Thread уже доступен - вся последующая логика в этой функции не меняет созданный поток в любом случае.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

noahfalk picture noahfalk  ·  3Комментарии

omariom picture omariom  ·  3Комментарии

bencz picture bencz  ·  3Комментарии

ilmax picture ilmax  ·  3Комментарии

btecu picture btecu  ·  3Комментарии