Recolección de basura informática. El espacio de memoria se va llenando con diferentes "objetos" (representados con colores), también pueden destruirse algunos de ellos, dejando "huecos" en el espacio de memoria. Cuando ya no queda espacio disponible, o cuando lo decide la rutina de recolección de basura, la memoria es "compactada", colocando todos los "objetos" que se están usando al principio, y consolidando todos los "huecos" de memoria al final, quedando así una gran área de memoria disponible para la futura creación de objetos.

Un recolector de basura (del inglés garbage collector) es un mecanismo implícito de gestión de memoria implementado en algunos lenguajes de programación de tipo interpretado o semiinterpretado.

Breve reseña histórica

El concepto de recolección de basura fue inventado por John McCarthy en 1958 para evitar la gestión manual de memoria en el lenguaje Lisp.[1]

Contexto

Cualquier programa informático hace uso de una cierta cantidad de memoria de trabajo puesta a su disposición por el sistema operativo. Esta memoria tiene que ser gestionada por el propio programa para:

Generalmente, el programador dispone de una biblioteca de código que se encarga de estas tareas. No obstante, el propio programador es responsable de utilizar adecuadamente esta biblioteca.

Esto tiene la ventaja de que se hace un uso eficiente de la memoria, es decir, los espacios de memoria quedan libres cuando ya no son necesarios. No obstante, este mecanismo explícito de gestión de memoria es propenso a errores. Por ejemplo, un programador puede olvidar liberar la memoria de manera que, tarde o temprano, no quede memoria disponible, abortando la ejecución del programa.

Como alternativa es necesaria una gestión implícita de memoria, con lo que el programador no es consciente de la reserva y liberación de memoria. Esto es obligado en algunos lenguajes de programación en los que no se maneja el concepto de memoria. Por ejemplo, en lenguajes declarativos como Lisp o Prolog.

Funcionamiento

Cuando un lenguaje dispone de recolección de basura, el programador no tiene que invocar a una subrutina para liberar memoria. La reserva de memoria también es más o menos automática sin la intervención del programador. Por ejemplo:

Cuando se compila el programa, automáticamente se incluye en este una subrutina correspondiente al recolector de basura. Esta subrutina también es invocada periódicamente sin la intervención del programador.

El recolector de basura es informado de todas las reservas de memoria que se producen en el programa. Además, el compilador colabora para que sea posible llevar una cuenta de todas las referencias que existen a un determinado espacio de memoria reservado.

Cuando se invoca el recolector de basura, recorre la lista de espacios reservados observando el contador de referencias de cada espacio. Si un contador ha llegado a cero significa que ese espacio de memoria ya no se usa y, por tanto, puede ser liberado.

Naturalmente, este proceso consume un cierto tiempo en el que no se hace nada verdaderamente útil para el propósito del programa. Por tanto, no puede ser invocado con demasiada frecuencia.

En consecuencia, el único inconveniente a este mecanismo es determinar cuándo se tiene que ejecutar el recolector de basura. Existen varios algoritmos para hacerlo, pero el más eficiente es el primero de ellos:

Ventajas y desventajas

Las ventajas y desventajas de este mecanismo de gestión de memoria son las opuestas al mecanismo explícito:

Implementación

Existe la posibilidad de implementar la recolección de basura como una biblioteca de código más, pero por norma general no es así. El propio diseño de ciertos lenguajes de programación hace necesaria la existencia del recolector de basura. Para poder implementar estos lenguajes se requieren dos actuaciones:

Ejemplos de lenguajes con recolector de basura

Véase también

Referencias

  1. McCarthy, John (30 de abril de 1960). «Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I» [Funciones recursivas de expresiones simbólicas y su cómputo por ordenador, primera parte] (pdf). Universidad Stanford (en inglés). p. 27. Archivado desde el original el 26 de noviembre de 2001. Consultado el 14 de abril de 2020. «We already called this process “garbage collection”, but I guess I chickened out of usingit in the paper—or else the Research Laboratory of Electronics grammar ladies wouldn’t let me. »