Sobes.tech
Middle

¿Cuál es el concepto de recolección de basura en C#?

sobes.tech AI

Respuesta de la IA

El recolector de basura (GC) gestiona automáticamente la memoria, liberándola de objetos que ya no son utilizados por el programa. Funciona en modo automático, eliminando la necesidad de gestionar manualmente la asignación y liberación de memoria, lo que reduce el riesgo de fugas de memoria y errores relacionados con punteros.

El proceso de recolección de basura incluye las siguientes etapas:

  1. Marcado (Marking): El GC determina qué objetos todavía están en uso. Para ello, comienza con un conjunto de objetos raíz (por ejemplo, variables globales o objetos en las pilas de los hilos actuales) y marca todos los objetos accesibles desde ellos.
  2. Compactación (Compacting): El GC mueve los objetos supervivientes en la memoria para liberar bloques contiguos para una distribución más eficiente de la nueva memoria. Esta etapa también actualiza los punteros a los objetos movidos.
  3. Limpieza (Sweeping): El GC libera la memoria ocupada por objetos que no fueron marcados como utilizados.

El GC en .NET es generacional. La memoria se divide en generaciones:

  • Generación 0 (Gen 0): Contiene objetos de corta duración. La recolección de esta generación ocurre con mayor frecuencia.
  • Generación 1 (Gen 1): Es un búfer para objetos que sobrevivieron a la recolección de Gen 0. Se recolecta con menos frecuencia que Gen 0.
  • Generación 2 (Gen 2): Contiene objetos de larga duración. Se recolecta con menos frecuencia y requiere mayor rendimiento.

Los objetos se mueven entre generaciones según "sobrevivan" en las recolecciones de basura.

Por ejemplo, la creación y uso de un objeto:

// Creación del objeto
MyObject obj = new MyObject();
// Uso del objeto
obj.DoSomething();
// El objeto ya no se usa, GC puede recogerlo
obj = null;

La llamada forzada a la recolección de basura puede hacerse con GC.Collect(), pero generalmente no se recomienda, ya que el GC optimiza automáticamente el momento de las recolecciones.

// Ejecución forzada de la recolección de basura (no recomendado en la mayoría de los casos)
GC.Collect();
GC.WaitForPendingFinalizers(); // Espera a que finalicen los finalizadores