Recolección de basura

Definición: ¿Qué significa recolección de basura?

La recolección de basura, en el contexto de .NET, es el proceso por el cual Common Language Runtime (CLR) de .NET Framework administra la memoria asignando y liberando memoria automáticamente.

El recolector de basura de .NET intenta compactar la memoria de tal manera que aumente el espacio de trabajo requerido para el montón. La clase GC de la biblioteca de clases .NET controla el recolector de basura. La tarea principal de realizar una recopilación la ejecuta el motor de optimización del GC que determina el mejor momento para realizar la recopilación en función de las asignaciones que se realizan. Las ejecuciones de GC no son deterministas ya que no se puede garantizar la llamada a GC. Sin embargo, las llamadas explícitas al método sobrecargado 'Collect ()' de la clase GC se pueden usar siempre que sea necesario.

Las ventajas que ofrece GC incluyen:

  • la eliminación del código de desasignación de memoria en las aplicaciones
  • uso de memoria optimizado en el montón administrado
  • limpieza de la memoria de los objetos recuperados que ya no están en uso (lo que ayuda a inicializar los objetos administrados asignados en el futuro y la provisión de seguridad de la memoria de los objetos para evitar que un objeto use el contenido de otro).

Techinfo explica la recolección de basura

GC administra la memoria virtual en el montón administrado, que es el segmento de memoria que se utiliza para almacenar y administrar los objetos creados en un proceso administrado. Si un objeto no tiene ninguna referencia y no se puede alcanzar o utilizar, se convierte en basura. Mientras GC realiza una recopilación en un subproceso separado, todos los objetos inutilizables se enumeran y se recupera la memoria asignada a ellos.

La recolección de basura se ejecuta en situaciones como cuando el sistema tiene poca memoria física o cuando la memoria asignada en el montón administrado excede el valor de umbral aceptable. Dado que el GC se ejecuta periódicamente, generalmente no es necesario llamar al método GC.Collect ().

Las dos opciones en las que GC se puede configurar para especificar la forma en que CLR debe funcionar son 1) estación de trabajo y 2) recolección de basura del servidor. La diferencia clave entre los dos es que el primero ocurre en el hilo del usuario que activó el GC, mientras que el segundo ocurre en los hilos que se ejecutan en el nivel de prioridad más alto. Además, la estación de trabajo GC siempre se usa en un sistema que tiene un solo procesador, mientras que el servidor GC consume muchos recursos con segmentos de mayor tamaño y se usa en sistemas con múltiples procesadores.

Los dos tipos de colecciones posibles son tipos completos y parciales. Una colección completa se ejecuta deteniendo la ejecución del programa y visitando cada objeto, siguiendo su puntero de objeto y marcando el objeto como accesible (o vivo) o inalcanzable (o condenado). Después de visitar los objetos, se recupera la memoria de los objetos inalcanzables y se deslizan los objetos vivos para que la memoria asignada sea contigua sin ningún espacio de desperdicio en el medio. La recopilación parcial busca solo una parte del montón y se utiliza cuando la recopilación completa resulta cara.

La limitación de GC es que no libera los objetos no utilizados a los que todavía se hace referencia, lo que puede provocar pérdidas de memoria.

Esta definición se escribió en el contexto de .NET