Pregunta

En el Javadoc de WeakHashMap.html, decía

"Cada objeto clave en un mapas de débil se almacena indirectamente como el referente de una referencia débil.Por lo tanto, una clave se eliminará automáticamente solo después de que las referencias débiles a ella, tanto dentro como fuera del mapa, hayan sido despejadas por el recolector de basura ".

Y luego

Tenga en cuenta que un objeto de valor puede referirse indirectamente a su clave a través del propio Deakhashmap;Es decir, un objeto de valor puede referirse fuertemente a algún otro objeto clave cuyo objeto de valor asociado, a su vez, se refiere fuertemente a la clave del objeto de primer valor.

Pero, ¿no deberían usarse tanto la clave como el valor como referencia débil en WeakHashMap?es decir.Si hay poca memoria, GC liberará la memoria retenida por el objeto de valor (ya que lo más probable es que el objeto de valor ocupe más memoria que el objeto clave en la mayoría de los casos).

¿Y si GC libera el objeto Valor, el Objeto Clave también puede estar libre?

Básicamente, estoy buscando un HashMap que reduzca el uso de memoria cuando hay poca memoria (GC recopila el valor y los objetos clave si es necesario).

¿Es posible en Java?

Gracias.

¿Fue útil?

Solución

Las referencias débiles son inapropiadas para los cachés: NetBeans lo hace y puede volverse tonto.

SoftReference es lo que quieres.En realidad, es bastante difícil hacerlo bien, así que copie la solución de otra persona.Algunas personas recomiendan gestionar explícitamente los cachés usted mismo.

ReferenceSólo funcionan con una única referencia.Hubo una propuesta para agregar "efímeros" a Java SE, pero no he visto una implementación que vaya a ninguna parte con eso.

Otros consejos

La idea es que se puede utilizar este mapa como estructura de datos de "búsqueda", que sólo mantiene los pares de valores-clave vivos que todavía se puede hacer referencia a (a través de una llave). Sin embargo, aunque la idea básica es agradable, recuerdo que no era tan útil como yo esperaba que fuera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top