Runtime: El GC concurrente no se ejecuta al mismo tiempo

Creado en 9 ago. 2019  ·  3Comentarios  ·  Fuente: dotnet/runtime

Veo un problema ocasional en netcore 2.2 donde un Gen2 GC concurrente parece no ejecutarse en el subproceso GC de fondo, sino que se ejecuta en el subproceso que desencadenó la recopilación.

Esto se observó en mi desarrollo de Windows 10 ejecutando una aplicación en la configuración de lanzamiento en el tiempo de ejecución de .NET Core 2.2 de 64 bits con el perfil de GC predeterminado (estación de trabajo, GC concurrente habilitado, modo de latencia interactiva), y pude tomar una muestra de perfview de la ocurrencia:

blockingConcurrentGC

Mirando a través de la fuente de GC, creo que puede haber un problema introducido en este compromiso . Antes del cambio, bgc_thread se establecería en el momento de la creación del hilo, y se garantizaría que se establecería en el momento en que se verifique en void gc_heap::garbage_collect (int n) . Después del cambio, bgc_thread ahora se establece dentro del nuevo hilo al inicio de su ejecución, lo que parece que introduciría una condición de carrera en la que ese campo puede no establecerse a tiempo para que continúe el GC concurrente.

area-GC-coreclr question

Comentario más útil

solo quería señalar que el GC real hecho aquí ya no es un BGC, simplemente lo trata como no pudimos crear el subproceso BGC, por lo que simplemente estamos haciendo un GC de bloqueo completo; el evento es engañoso (todavía dice Fondo), por lo que también debería arreglarse en caso de que no logremos hacer un BGC (no se pudo crear el hilo BGC o por cualquier otro motivo).

Todos 3 comentarios

ahh, buen hallazgo!
@PeterSolMS, @VSadov sería uno de ustedes por favor, eche un vistazo y hacer una solución?

solo quería señalar que el GC real hecho aquí ya no es un BGC, simplemente lo trata como no pudimos crear el subproceso BGC, por lo que simplemente estamos haciendo un GC de bloqueo completo; el evento es engañoso (todavía dice Fondo), por lo que también debería arreglarse en caso de que no logremos hacer un BGC (no se pudo crear el hilo BGC o por cualquier otro motivo).

para la carrera de configurar bgc_thread, en realidad no necesitamos configurarlo en bgc_thread_stub , en CreateSuspendableThread después de esta línea

args.Thread = SetupUnstartedThread(FALSE);

el objeto Thread ya está disponible; toda la lógica posterior en esta función no cambia el Thread que se creó de todos modos.

¿Fue útil esta página
0 / 5 - 0 calificaciones