Runtime: Le GC simultané ne parvient pas à s'exécuter simultanément

Créé le 9 août 2019  ·  3Commentaires  ·  Source: dotnet/runtime

Je vois un problème occasionnel sur netcore 2.2 où un GC Gen2 simultané semble ne pas s'exécuter sur le thread GC d'arrière-plan, mais plutôt sur le thread qui a déclenché la collecte.

Cela a été observé sur mon développement Windows 10 exécutant une application en configuration Release sur le runtime .NET Core 2.2 64 bits avec le profil GC par défaut (poste de travail, GC simultané activé, mode de latence interactif), et j'ai pu récupérer un échantillon de perfview de l'événement :

blockingConcurrentGC

En parcourant les sources GC, je pense qu'il peut y avoir un problème introduit dans ce commit . Avant le changement, bgc_thread serait défini au moment de la création du thread, et serait garanti d'être défini au moment où il est vérifié dans void gc_heap::garbage_collect (int n) . Après le changement, bgc_thread est maintenant défini dans le nouveau thread au début de son exécution, ce qui semble introduire une condition de concurrence où ce champ peut ne pas être défini à temps pour que le GC simultané se poursuive.

area-GC-coreclr question

Commentaire le plus utile

Je voulais juste souligner que le GC réel fait ici n'est plus un BGC - il le traite simplement comme nous n'avons pas réussi à créer le thread BGC, donc nous faisons simplement un GC bloquant complètement ; l'événement est trompeur (il indique toujours Contexte), donc cela devrait également être corrigé au cas où nous ne parviendrions pas à faire un BGC (échec de la création du fil BGC ou pour toute autre raison).

Tous les 3 commentaires

ahh, bonne trouvaille !
@PeterSolMS , @VSadov est- ce que l'un d'entre vous pourrait jeter un œil et faire un correctif ?

Je voulais juste souligner que le GC réel fait ici n'est plus un BGC - il le traite simplement comme nous n'avons pas réussi à créer le thread BGC, donc nous faisons simplement un GC bloquant complètement ; l'événement est trompeur (il indique toujours Contexte), donc cela devrait également être corrigé au cas où nous ne parviendrions pas à faire un BGC (échec de la création du fil BGC ou pour toute autre raison).

pour la course de définition de bgc_thread, nous n'avons en fait pas besoin de le définir dans bgc_thread_stub , dans CreateSuspendableThread après cette ligne

args.Thread = SetupUnstartedThread(FALSE);

l'objet Thread est déjà disponible - toute la logique ultérieure de cette fonction ne change pas le Thread qui a été créé de toute façon.

Cette page vous a été utile?
0 / 5 - 0 notes