Una guía para la recolección de basura en la programación

¿Qué es la recolección de basura?

En términos generales, la recolección de basura (GC) no es más que recolectar o recuperar memoria que se ha asignado a objetos pero que actualmente no se usa en ninguna parte de nuestro programa.

Entremos en más detalles. La recolección de basura es el proceso en el que los programas intentan liberar espacio de memoria que los objetos ya no utilizan.

La recolección de basura se implementa de manera diferente para cada idioma. La mayoría de los lenguajes de programación de alto nivel tienen algún tipo de recolección de basura incorporada. Los lenguajes de programación de bajo nivel pueden agregar recolección de basura a través de bibliotecas.

Como se dijo anteriormente, cada lenguaje de programación tiene su propia forma de realizar GC. En la programación C, los desarrolladores deben ocuparse de la asignación y desasignación de memoria mediante las funciones malloc () y dealloc (). Pero, en el caso de C #, los desarrolladores no necesitan ocuparse de GC y tampoco se recomienda.

¿Cómo ocurre la asignación de memoria?

En C #, la asignación de memoria de los objetos se realiza en un montón administrado, del que se encarga CLR (Common Language Runtime). La asignación de memoria para el montón se realiza a través de win32 dll en el sistema operativo y de manera similar en C.

Pero, en C, los objetos se colocan en la memoria dondequiera que haya espacio libre que se ajuste al tamaño del objeto. Además, el mapeo de memoria funciona en base a conceptos de Linkedlist. En C #, la asignación de memoria para el montón ocurre de forma lineal, una tras otra.

Siempre que se crea un nuevo objeto, la memoria se asigna en el montón y el puntero se mueve a la siguiente dirección de memoria. La asignación de memoria en C # es más rápida que en C. Esto se debe a que en C la memoria necesita buscar y asignar el objeto. Por lo que tomará un poco más de tiempo que C #.

Generaciones en C # GC

En la programación .net, el montón tiene tres generaciones llamadas generaciones 0, 1 y 2. La generación 0 se llena primero cada vez que se crea un nuevo objeto. Luego, el recolector de basura se ejecuta cuando se llena la Generación 0. Los objetos recién creados se colocan en la Generación 0.

Mientras se realiza la recolección de basura, todos los objetos no deseados se destruyen, por lo que la memoria se libera y se compacta. GC se encarga de señalar los indicadores de la memoria liberada una vez que ocurre GC.

Las generaciones 1 y 2 contienen objetos que tienen una vida útil más larga. La GC en las generaciones 1 y 2 no sucederá hasta que las generaciones 0 tengan suficiente memoria para asignar.

No debe invocar GC mediante programación. Es bueno dejar que suceda por sí solo. GC recibe una llamada cada vez que se llena la generación 0.

Pros y contras de GC

La recolección de basura es una herramienta que ahorra tiempo a los programadores. Por ejemplo, reemplaza la necesidad de funciones como malloc () y free () que se encuentran en C. También puede ayudar a prevenir pérdidas de memoria.

La desventaja de la recolección de basura es que tiene un impacto negativo en el rendimiento. GC tiene que ejecutarse regularmente a través del programa, verificando las referencias de objetos y limpiando la memoria. Esto consume recursos y, a menudo, requiere que el programa se detenga.

Cuando hacerlo

Si un objeto no tiene referencias (ya no es accesible), entonces es elegible para la recolección de basura.

Por ejemplo, en el código Java a continuación, el objeto Thing originalmente referenciado por 'thing1' tiene su única referencia redirigida a otro objeto en el montón. Esto significa que es inalcanzable y el recolector de basura no asignará su memoria.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

Un ejemplo de recolección de basura es ARC, abreviatura de conteo automático de referencias. Esto se usa en Swift, por ejemplo. ARC se reduce a realizar un seguimiento de las referencias a todos los objetos que se crean. Si la cantidad de referencias cae a 0, el objeto se marcará para desasignar.

Más información:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - Para saber más sobre la recolección de basura