Estou vendo um problema ocasional no netcore 2.2, em que um GC Gen2 simultâneo parece não ser executado no encadeamento do GC em segundo plano, mas sim no encadeamento que acionou a coleção.
Isso foi observado em meu desenvolvimento do Windows 10 executando um aplicativo na configuração de versão no tempo de execução do .NET Core 2.2 de 64 bits com o perfil GC padrão (estação de trabalho, GC simultâneo habilitado, modo de latência interativo) e consegui obter uma amostra do perfview da ocorrência:
Olhando a fonte do GC, acho que pode haver um problema introduzido neste commit . Antes da mudança, bgc_thread
seria definido no momento da criação do thread e teria a garantia de ser definido no momento em que fosse verificado em void gc_heap::garbage_collect (int n)
. Após a mudança, bgc_thread
agora é definido dentro do novo thread no início de sua execução, o que parece que introduziria uma condição de corrida em que esse campo pode não ser definido a tempo para o GC concorrente continuar.
ahh, bom achado!
@PeterSolMS , @VSadov , um de vocês poderia dar uma olhada e fazer uma correção?
só queria salientar que o GC real feito aqui não é mais um BGC - ele apenas o trata porque falhamos em criar o encadeamento BGC, então estamos simplesmente fazendo um GC de bloqueio completo; o evento é enganoso (ainda diz Background), de modo que também deve ser corrigido no caso de não conseguirmos realmente fazer um BGC (falha ao criar o thread BGC ou por qualquer outro motivo).
para a corrida de configuração bgc_thread, na verdade não precisamos configurá-lo em bgc_thread_stub
, em CreateSuspendableThread
após esta linha
args.Thread = SetupUnstartedThread(FALSE);
o objeto Thread já está disponível - toda a lógica posterior nesta função não altera o Thread que foi criado de qualquer maneira.
Comentários muito úteis
só queria salientar que o GC real feito aqui não é mais um BGC - ele apenas o trata porque falhamos em criar o encadeamento BGC, então estamos simplesmente fazendo um GC de bloqueio completo; o evento é enganoso (ainda diz Background), de modo que também deve ser corrigido no caso de não conseguirmos realmente fazer um BGC (falha ao criar o thread BGC ou por qualquer outro motivo).