Я вижу случайную проблему в netcore 2.2, когда параллельный сборщик мусора Gen2 не запускается в фоновом потоке сборщика мусора, а не запускается в потоке, запустившем сбор.
Это наблюдалось при моей разработке для Windows 10, когда я запускал приложение в конфигурации Release в 64-разрядной среде выполнения .NET Core 2.2 с профилем GC по умолчанию (рабочая станция, включен параллельный сборщик мусора, интерактивный режим задержки), и я смог получить образец perfview. возникновения:
Просматривая исходный код GC, я думаю, что в этом коммите может быть проблема. Перед изменением bgc_thread
будет установлен во время создания потока и гарантированно будет установлен к моменту его проверки в void gc_heap::garbage_collect (int n)
. После изменения bgc_thread
теперь устанавливается в новом потоке в начале его выполнения, что, похоже, приведет к возникновению состояния гонки, когда это поле может не быть установлено вовремя для продолжения параллельного GC.
ааа, хорошая находка!
@PeterSolMS , @VSadov не
просто хотел указать, что фактический сборщик мусора, сделанный здесь, больше не является BGC - он просто обрабатывает его, поскольку мы не смогли создать поток BGC, поэтому мы просто выполняем полную блокировку сборки мусора; событие вводит в заблуждение (он по-прежнему говорит «Фон»), так что это также должно быть исправлено на случай, если мы не сможем фактически выполнить BGC (не удалось создать поток BGC или по любой другой причине).
для гонки установки bgc_thread нам на самом деле не нужно устанавливать его в bgc_thread_stub
, в CreateSuspendableThread
после этой строки
args.Thread = SetupUnstartedThread(FALSE);
объект Thread уже доступен - вся последующая логика в этой функции не меняет созданный поток в любом случае.
Самый полезный комментарий
просто хотел указать, что фактический сборщик мусора, сделанный здесь, больше не является BGC - он просто обрабатывает его, поскольку мы не смогли создать поток BGC, поэтому мы просто выполняем полную блокировку сборки мусора; событие вводит в заблуждение (он по-прежнему говорит «Фон»), так что это также должно быть исправлено на случай, если мы не сможем фактически выполнить BGC (не удалось создать поток BGC или по любой другой причине).