Recolector de basura


Recolector de basura

Recolector de basura

Recolección de basura: 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í un gran área de memoria disponible para la futura creación de objetos.

Un recolector de basura (en 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 semi-interpretado.

Contenido

Breve reseña histórica

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

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:

  • Reservar espacios de memoria para su uso.
  • Liberar espacios de memoria previamente reservados.
  • Compactar espacios de memoria libres y consecutivos entre sí.
  • Llevar cuenta de qué espacios están libres y cuáles no.

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, donde el programador no es consciente de la reserva y liberación de memoria. Esto es obligado en algunos lenguajes de programación donde no se maneja el concepto de memoria. Por ejemplo en lenguajes declarativos como Lisp o Prolog.

Cómo funciona

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:

  • En los lenguajes orientados a objetos: se reserva memoria cada vez que el programador crea un objeto, pero éste no tiene que saber cuanta memoria se reserva ni cómo se hace esto.
  • En los lenguajes declarativos: cada vez que se construye una expresión se reserva memoria (de una manera inteligente), pero el programador no es consciente de ello.

Cuando se compila el programa, automáticamente se incluye en éste 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:

  • Esperar a que no quede memoria libre, y entonces, ejecutar el recolector de basura.
  • Fijar un umbral de ocupación de la memoria libre y ejecutar el recolector de basura cuando se supere dicho umbral.
  • Ejecutar el recolector de basura a intervalos regulares (no siempre es posible).
  • Ejecutar el recolector de basura justo antes de cada reserva de memoria.
  • Permitir al programador que invoque explícitamente al recolector de basura cuando quiera.

Ventajas y desventajas

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

  • El programador no puede cometer errores y queda liberado de la tediosa tarea de gestionar la memoria.
  • La memoria permanece retenida durante más tiempo del estrictamente necesario.
  • El recolector de basura tarda cierto tiempo en hacer su tarea y produce pausas que pueden hacer la técnica incompatible con sistemas de tiempo real.

Cómo se implementa

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:

  • Que el compilador proporcione la información necesaria para el recolector de basura (el contador de referencias).
  • Que el entorno de ejecución o máquina virtual implemente la subrutina del recolector de basura.

Ejemplos de lenguajes con recolector de basura

Enlaces externos

Obtenido de "Recolector de basura"

Wikimedia foundation. 2010.

Mira otros diccionarios:

  • recolector — (adj) (Intermedio) que sirve para recoger y acumular algo Ejemplos: El agricultor compró un nuevo equipo recolector de frutos para facilitarse el trabajo. Enfrente del edificio ha pasado un camión recolector de basura. Sinónimos: cobrador,… …   Español Extremo Basic and Intermediate

  • recolector — adj y s 1 Que recolecta algo o se dedica a hacerlo; que sirve para recolectar alguna cosa: los recolectores de la cosecha, tribus de recolectores, los camiones recolectores de basura, recolectores de aguas negras 2 s Persona que recoge las… …   Español en México

  • Recolección de basura — El recolector de basura (en 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 semi interpretado …   Enciclopedia Universal

  • Impacto ambiental potencial de la recolección y eliminación de basura — Impacto ambiental potencial de la recolección y eliminación de basura:Los objetivos globales de los proyectos de recolección y eliminación de basura. Proporcionar a la comunidad, un ambiente sano, libre de gérmenes, desechos y vectores, un… …   Wikipedia Español

  • Lenguaje de programación Java — Saltar a navegación, búsqueda Java Paradigma: Orientado a objetos Apareció en: 1991 Diseñado por: Sun Microsystems Tipo de dato: Fuerte, Estático Implementacion …   Wikipedia Español

  • Java (lenguaje de programación) — Este artículo o sección se encuentra desactualizado. Es posible que la información suministrada aquí haya cambiado o sea insuficiente …   Wikipedia Español

  • Fuga de memoria — Una fuga de memoria (más conocido por el término inglés memory leak) es un error de software que ocurre cuando un bloque de memoria reservada no es liberada en un programa de computación. Comúnmente ocurre porque se pierden todas las referencias… …   Wikipedia Español

  • Lenguaje de programación D — Saltar a navegación, búsqueda D Paradigma: multiparadigma: orientado a objetos, imperativo Apareció en: 1995 Diseñado por: Walter Bright Última versión: 1.050(estable) 2.035(inestable) (14 de octubre de 2009 …   Wikipedia Español

  • D (lenguaje de programación) — Este artículo o sección necesita referencias que aparezcan en una publicación acreditada, como revistas especializadas, monografías, prensa diaria o páginas de Internet fidedignas. Puedes añadirlas así o avisar …   Wikipedia Español

  • Visual C++ — Desarrollador Microsoft Visual C++ Developer Center Información general Género Entorno de desa …   Wikipedia Español