El uso de referencias débiles es algo de lo que nunca he visto una implementación, así que estoy tratando de averiguar cuál es el caso de uso para ellos y cómo funcionaría la implementación. ¿Cuándo ha necesitado usar un WeakHashMap
o WeakReference
y cómo se usó?
java
weak-references
18 Conejo
fuente
fuente
Respuestas:
Comprender las referencias débiles , Ethan Nicholas
fuente
WeakHashMap
.WeakReference
versusSoftReference
Una distinción para ser clara es la diferencia entre a
WeakReference
y aSoftReference
.Básicamente una
WeakReference
habrá GC-d por la JVM con impaciencia, una vez que el objeto referenciado no tiene duras referencias a ella. UnSoftReference
objeto d, por otro lado, tenderá a ser dejado por el recolector de basura hasta que realmente necesite recuperar la memoria.Una memoria caché donde los valores se mantienen dentro de
WeakReference
s sería bastante inútil (en aWeakHashMap
, son las claves las que están referenciadas débilmente).SoftReferences
son útiles para ajustar los valores cuando se desea implementar un caché que puede crecer y reducirse con la memoria disponible.fuente
Un uso común de
WeakReference
sysWeakHashMap
en particular es para agregar propiedades a los objetos. Ocasionalmente, desea agregar alguna funcionalidad o datos a un objeto, pero la subclasificación y / o composición no son una opción, en ese caso, lo más obvio sería crear un hashmap que vincule el objeto que desea extender a la propiedad que desea agregar. . entonces, cuando necesite la propiedad, puede buscarla en el mapa. Sin embargo, si los objetos a los que está agregando propiedades tienden a destruirse y crearse mucho, puede terminar con una gran cantidad de objetos antiguos en su mapa que ocupan mucha memoria.Si usa un
WeakHashMap
lugar, los objetos dejarán su mapa tan pronto como ya no los use el resto de su programa, que es el comportamiento deseado.Tenía que hacer esto para añadir algunos datos para
java.awt.Component
moverse por un cambio en el JRE entre 1.4.2 y 1.5, podría haber arreglado subclasificando todos los componentes que estaba interesado int (JButton
,JFrame
,JPanel
....) pero esto fue mucho más fácil con mucho menos código.fuente
Otro caso útil para
WeakHashMap
yWeakReference
es una implementación de registro de escucha .Cuando crea algo que quiere escuchar ciertos eventos, generalmente registra un oyente, por ejemplo
Si
manager
almacena su oyente con aWeakReference
, eso significa que no necesita eliminar el registro, por ejemplo, con unmanager.removeListener(myListenerImpl)
porque se eliminará automáticamente una vez que su oyente o su componente que lo tiene no esté disponible.Por supuesto, aún puede eliminar manualmente su escucha, pero si no lo hace o lo olvida, no causará una pérdida de memoria y no evitará que su escucha se recolecte basura.
¿Dónde
WeakHashMap
entra en escena?El registro de oyentes que desea almacenar oyentes registrados como
WeakReference
s necesita una colección para almacenar estas referencias. No hayWeakHashSet
implementación en la biblioteca estándar de Java solo aWeakHashMap
pero podemos usar fácilmente la última para "implementar" la funcionalidad de la primera:Con esto
listenerSet
para registrar un nuevo oyente, solo tiene que agregarlo al conjunto, e incluso si no se elimina explícitamente, si el oyente ya no está referenciado, la JVM lo eliminará automáticamente.fuente
WeakHashMap
es cuando necesita unHashMap
objeto. Así wow usted no tiene que hacer manualmente hashmap.remove vez porque los artículos se retiran una vez que el obj automagicamente está fuera del alcance! ¡Literalmente mágico! Un truco mágico tan feo es un facepalm completo .WeakReference
simplifica en gran medida la base del código y evita errores innecesarios relacionados con no darse de baja. ¿Qué inconveniente?Esta publicación de blog muestra el uso de ambas clases: Java: sincronización en una ID . El uso es algo como esto:
IdMutextProvider proporciona objetos basados en id para sincronizar. Los requisitos son:
Esto se logra utilizando un mapa de almacenamiento interno de tipo:
El objeto es clave y valor. Cuando nada externo al mapa tiene una referencia dura al objeto, puede ser basura recolectada. Los valores en el mapa se almacenan con referencias duras, por lo que el valor debe estar envuelto en una WeakReference para evitar una pérdida de memoria. Este último punto está cubierto en el javadoc .
fuente
Si, por ejemplo, desea realizar un seguimiento de todos los objetos creados de una determinada clase. Para permitir que estos objetos sean recolectados de basura, mantenga una lista / mapa de referencias débiles a los objetos en lugar de los objetos en sí.
Ahora, si alguien pudiera explicarme referencias fantasmas, sería feliz ...
fuente
Como se indicó anteriormente, las referencias débiles se mantienen mientras exista una referencia fuerte.
Un ejemplo de uso sería usar WeakReference dentro de los oyentes, para que los oyentes ya no estén activos una vez que la referencia principal a su objeto de destino desaparezca. Tenga en cuenta que esto no significa que WeakReference se elimine de la lista de oyentes, la limpieza aún es necesaria, pero se puede realizar, por ejemplo, a horas programadas. Esto también tiene el efecto de evitar que el objeto escuchado contenga fuertes referencias y eventualmente sea una fuente de hinchazón de memoria. Ejemplo: componentes de la interfaz gráfica de usuario de Swing que hacen referencia a un modelo que tiene un ciclo de vida más largo que la ventana.
Mientras jugaba con los oyentes como se describió anteriormente, nos dimos cuenta rápidamente de que los objetos se recogen "inmediatamente" desde el punto de vista del usuario.
fuente
WeakReferences
tu comentario está completamente equivocado!Un uso del mundo real que tuve para WeakReferences es si tienes un solo objeto muy grande que rara vez se usa. No desea mantenerlo en la memoria cuando no es necesario; pero, si otro hilo necesita el mismo objeto, tampoco querrás dos de ellos en la memoria. Puede mantener una referencia débil al objeto en alguna parte, y referencias duras en los métodos que lo utilizan; cuando ambos métodos terminen, el objeto será recogido.
fuente
Hice una búsqueda en el código de Google para "new WeakHashMap ()".
Obtuve un montón de coincidencias del proyecto GNU classpath y
fuente
puede usar weakhashmap para implementar un almacenamiento en caché sin recursos para la creación de objetos expansivos.
pero tenga en cuenta que no es deseable tener objetos mutables. Lo usé para almacenar en caché los resultados de la consulta (que tardan unos 400 ms en ejecutarse) en un motor de búsqueda de texto, que rara vez se actualiza.
fuente