Runtime: O GC simultâneo não funciona ao mesmo tempo

Criado em 9 ago. 2019  ·  3Comentários  ·  Fonte: dotnet/runtime

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:

blockingConcurrentGC

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.

area-GC-coreclr question

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).

Todos 3 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

GitAntoinee picture GitAntoinee  ·  3Comentários

omajid picture omajid  ·  3Comentários

jzabroski picture jzabroski  ·  3Comentários

EgorBo picture EgorBo  ·  3Comentários

bencz picture bencz  ·  3Comentários