July 2009

Usando referencias débiles (weak references)

Introducción

Una referencia débil (weak reference) es un concepto estrechamente unido al de recolector de basura, lo cual significa que solo esta presente en aquellos lenguajes que tienen un recolector de basura.

Para clarificar lo que es una referencia débil primero tenemos que explorar (en términos simples) que es el recolector de basura y los fundamentos en los que se basa para trabajar.

Fundamentos del recolector de basura

Los lenguajes imperativos tradicionales siempre han tenido que manejar manualmente la memoria de los tipos por referencia. De esta forma, cada vez que deseabamos obtener una nueva instancia de una clase o una estructura en memoria necesitabamos crearla reservando la memoria necesaria, memoria que quedaba reservada en el heap.

En ese momento la memoria quedaba marcada como usada, de forma que cuando pidieramos otro "trozo" de memoria no obtuvieramos la misma dirección.

Evidentemente, en algún momento, dejabamos de necesitar ese primer fragmento de memoria, de forma que necesitamos decirle al sistema que esa parte del heap ya no nos es necesaria y por lo tante esta disponible. Esta operación se conoce como "liberar la memoria". Y ese es más o menos el problema que ha estado introduciendo bugs en las aplicaciones durante más de tres decadas. Si se nos olvida liberar esa memoria, entonces nunca se queda libre y por tanto nunca la recuperamos ni podemos usarla de nuevo. Con el tiempo (o con un bucle muy rápido) terminamos consumiendo toda la memoria disponible, lo que nos lleva primero a un impacto en el rendimiento de la aplicación y finalmente a que la aplicación se cierre por falta de memoria.