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