Desarrollador .NET: pregunta de entrevista
¿Cómo funciona el garbage collection en .NET?
El GC de .NET asigna objetos en generaciones, traza alcanzables desde roots, compacta heaps elegibles y trata objetos grandes aparte. Mide tasa de asignación, retención, finalizers y pausas antes de ajustar.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
El GC de .NET es generacional: los objetos nuevos caen en gen 0, los supervivientes se promueven a gen 1 y luego a gen 2, y los objetos de más de 85 KB van al heap de objetos grandes, que solo se recolecta con gen 2. Las recolecciones de gen 0 son frecuentes y baratas; las de gen 2 son raras y pueden pausar más, sobre todo en modo servidor con heaps grandes. La tasa de asignación determina la frecuencia de gen 0, la retención determina la promoción, y los finalizadores retrasan la liberación un ciclo completo. El GC de servidor usa un heap por núcleo para throughput; el de estación de trabajo favorece la latencia en escritorio. Las decisiones salen de dotnet-counters y trazas, no de valores por defecto elegidos a ciegas.
Ejemplo
Una API con pausas periódicas de 300 ms mostraba en dotnet-counters recolecciones de gen 2 cada minuto; la causa era un array de bytes de 100 KB por solicitud que caía en el heap de objetos grandes. Alquilarlo de ArrayPool eliminó el churn del LOH y las pausas. Un segundo servicio asignaba 2 GB por segundo de cadenas de vida corta por interpolación en logs, arreglado con logging estructurado con plantillas de mensaje.
Errores frecuentes
- Llamar a GC.Collect desde código de aplicación para arreglar una fuga.
- Ignorar el heap de objetos grandes al asignar buffers grandes por solicitud.
- Cambiar a GC de servidor en un contenedor con memoria limitada y ser eliminado por superar los límites.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.