.NET Core: recolección de elementos no utilizados
En este capítulo, cubriremos el concepto de recolección de basura, que es una de las características más importantes de la plataforma de código administrado .NET. El recolector de basura (GC) administra la asignación y liberación de memoria. El recolector de basura sirve como administrador de memoria automático.
No es necesario saber cómo asignar y liberar memoria o administrar la vida útil de los objetos que usan esa memoria.
Se realiza una asignación cada vez que declara un objeto con una palabra clave "nueva" o un tipo de valor está en un cuadro. Las asignaciones suelen ser muy rápidas
Cuando no hay suficiente memoria para asignar un objeto, el GC debe recolectar y eliminar la memoria basura para que la memoria esté disponible para nuevas asignaciones.
Este proceso se conoce como garbage collection.
Ventajas de la recolección de basura
La recolección de basura proporciona los siguientes beneficios:
No necesita liberar memoria manualmente mientras desarrolla su aplicación.
También asigna objetos en el montón administrado de manera eficiente.
Cuando los objetos ya no se utilicen, los recuperará borrando su memoria y mantendrá la memoria disponible para futuras asignaciones.
Los objetos administrados obtienen automáticamente contenido limpio para empezar, por lo que sus constructores no tienen que inicializar todos los campos de datos.
También proporciona seguridad a la memoria al asegurarse de que un objeto no pueda usar el contenido de otro objeto.
Condiciones para la recolección de basura
La recolección de basura se produce cuando se cumple una de las siguientes condiciones.
El sistema tiene poca memoria física.
La memoria que utilizan los objetos asignados en el montón administrado supera un umbral aceptable. Este umbral se ajusta continuamente a medida que se ejecuta el proceso.
los GC.Collectse llama al método y, en casi todos los casos, no es necesario llamar a este método, porque el recolector de basura se ejecuta continuamente. Este método se utiliza principalmente para situaciones y pruebas únicas.
Generaciones
El recolector de basura .NET tiene 3 generaciones y cada generación tiene su propio montón que se utiliza para el almacenamiento de objetos asignados. Existe un principio básico de que la mayoría de los objetos son de corta o larga duración.
Primera generación (0)
En la Generación 0, los objetos se asignan primero.
En esta generación, los objetos a menudo no viven más allá de la primera generación, ya que ya no están en uso (fuera de su alcance) cuando ocurre la siguiente recolección de basura.
La generación 0 se recopila rápidamente porque su montón asociado es pequeño.
Segunda generación (1)
En la Generación 1, los objetos tienen un espacio de segunda oportunidad.
Los objetos que tienen una vida corta pero sobreviven a la colección de la generación 0 (a menudo se basan en tiempos coincidentes) pasan a la generación 1.
Las colecciones de generación 1 también son rápidas porque su montón asociado también es pequeño.
Los dos primeros montones siguen siendo pequeños porque los objetos se recopilan o se promueven al montón de próxima generación.
Tercera generación (2)
En la Generación 2, todos los objetos largos están vivos y su montón puede crecer hasta ser muy grande.
Los objetos de esta generación pueden sobrevivir mucho tiempo y no existe un montón de próxima generación para promover aún más los objetos.
El recolector de basura tiene un montón adicional para objetos grandes conocido como montón de objetos grandes (LOH).
Está reservado para objetos de 85.000 bytes o más.
Los objetos grandes no se asignan a los montones generacionales, sino que se asignan directamente a la LOH
Las recopilaciones de Generación 2 y LOH pueden llevar un tiempo considerable para los programas que se han ejecutado durante mucho tiempo o que operan con grandes cantidades de datos.
Se sabe que los grandes programas de servidor tienen montones de decenas de GB.
El GC emplea una variedad de técnicas para reducir la cantidad de tiempo que bloquea la ejecución del programa.
El enfoque principal es realizar la mayor cantidad posible de trabajo de recolección de basura en un subproceso en segundo plano de una manera que no interfiera con la ejecución del programa.
El GC también expone algunas formas para que los desarrolladores influyan en su comportamiento, lo que puede ser bastante útil para mejorar el rendimiento.