... y ese es el objetivo. Las referencias débiles son útiles, si no desea (o no puede permitirse) retener un objeto indefinidamente en la memoria. Considere el siguiente caso de uso: necesita asociar información con clases. Ahora, dado que se está ejecutando en un entorno, donde las clases pueden volver a cargarse (por ejemplo, un entorno Tomcat u OSGi), quiere que el recolector de basura pueda recuperar versiones antiguas de una clase tan pronto como lo considere seguro. .
Un primer intento de implementar esto, podría parecer
class ClassAssoc {
private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}
El problema aquí es: esto sería mantener a todas las clases en el miembro cache
siempre (o al menos, a no ser que se retiran manualmente), obligando al recolector de basura para retenerlos indefinidamente, incluido todo lo que se hace referencia de la clase (valores de miembros estáticos, información del cargador de clases, ...)
Al usar referencias débiles, el recolector de basura puede reclamar la versión anterior de la clase tan pronto como ninguna otra las referencias a él (generalmente instancias) existen. Por otro lado, mientras existan tales referencias, se garantiza que el valor también será accesible desde el objeto de referencia débil, y por lo tanto, es una clave válida en la tabla de caché.
Añadir concurrencia y otras atrocidades a la imagen, y estás en lo MapMaker
proporciona opcionalmente también ...
¿Cómo funciona la pregunta? – whiskeysierra