Weak Reference o como ayudar al recolector de basura

Una weak reference o referencia débil es como su propio nombre indica una referencia a un objeto que no impide que el recolector de basura la borre. Normalmente se utilizan referencias fuertes (Strong references) a la hora de definir objetos pero esto puede dar lugar en algunos casos a errores del tipo OutOfMemoryError, debido a que esos objetos no son liberados de memoria.

Para evitar esto se cuenta con estas weak reference que no hacen otra cosa que decirle al recolector de basura que cuando no estén usadas en ese momento, pase a borrarlas.


Esto parece una buena solución para evitar los problemas de memoria en las máquinas, optimizar recursos, mejorar código o reparar aplicativos que hacen caer máquinas, pero todo tiene una parte negativa, como siempre, nos puede suceder que volvamos a referenciar desde otra parte de nuestro código a ese objeto definido mediante weak reference y comprobemos con sorpresa que ese objeto ya no existe.

Para evitar esto mismo podemos hacer uso, por ejemplo de uno de los patrones mas utilizados, el Singleton .

Si bien, es verdad que precisamente esta funcionalidad que propongo, el usar un singleton y una referencia débil, choca frontalmente con la propia filosofia del singleton, que viene a ser una única instancia de un objeto que este presente durante el ciclo de vida de la aplicación o la sesión, pero aparentemente y a falta de pruebas de rendimiento más profundas, soluciona, sin necesidad de preguntar siempre si el objeto con weak reference es NULL, la problemática de encontrarnos súbitamente con un nullPointer, ya que después de pasar el recolector no se pierde el objeto y aparentemente, tal y como decía anteriormente, sin detrimento en rendimiento en términos de memoria, consume memoria, pero no tanta como con un objeto con una referencia fuerte.

En una próxima entrada podremos ver como se aplican estas referencias débiles a otro objeto como es un HashMap, conocido como WeakHashMap, cuya característica es que sus Keys constan de referencias débiles, cuya funcionalidad es muy similar a una weak reference, pero con la particularidad de que son las entradas no usadas las que son borradas por el recolector y no el objeto Map en si .

 
 
<O,_,O/>