Sé que hay un WeakHashMap en java.util, pero como usa WeakReferences para todo, al que solo hace referencia este Mapa, los objetos a los que se hace referencia se perderán en el próximo ciclo de GC. Por lo tanto, es casi inútil si desea almacenar en caché los datos aleatorios, que es muy probable que se soliciten nuevamente sin estar vinculados duramente el resto del tiempo. La mejor solución sería un mapa, que utiliza SoftReferences, pero no encontré ninguno en el paquete Java RT.¿Hay un SoftHashMap en Java?
Respuesta
Edición (Agosto 2012):
Resulta que actualmente la mejor solución son probablemente de guayaba 13.0 Cache
clases, explicó en Guava's Wiki - eso es lo que voy a utilizar. Incluso admite la construcción de un SoftHashMap
(vea CacheBuilder.newBuilder().softKeys()
), pero probablemente no sea lo que usted desea, como explica el experto en Java Jeremy Manson (a continuación encontrará el enlace).
No es que I know of (noviembre de 2008), pero que tipo de encontrar alguna aplicación SoftHashMap
en la red.
Como este: SoftHashMap
o this one.
edición (noviembre de 2009)
Como Matthias menciona en los comentarios, la Google GuavaMapMaker hace uso SoftReferences:
Un
ConcurrentMap
constructor, proporcionar cualquier combinación de estas características:
- teclas suaves o débiles,
- soft o valores débiles,
- caducidad temporizada, y
- cálculo a petición de los valores.
Como se mencionó en this thread, otro candidato JSR166y:
jsr166y.ConcurrentReferenceHashMap
Proporciona un mapa de referencia concurrente alternativa a la aplicación Google (que se basa en un subproceso de fondo para desalojar entradas)
Editar (agosto de 2012)
La implementación de Google utiliza una cadena de fondo solo cuando se solicita la caducidad temporal de las entradas. En particular, simplemente usa java.util.Timer
, que no es tan intrusivo como tener un hilo de fondo separado.
Jeremy Manson recomienda, para cualquier caché, el uso de esta función para evitar los peligros de SoftReference: http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html
Hay otra aplicación de Apache Commons, a saber org.apache.commons.collections.map.ReferenceMap; no es compatible con la eliminación temporizada, pero sí permite elegir si las claves se deben comparar por identidad o por igualdad. Además, esta implementación no es simultánea: se puede sincronizar, pero funciona menos en accesos de múltiples hilos.
No es un ejemplo de implementación en 98 issue of java specialists newsletter
He estado usando la versión 98 del Dr. Kabutz del SoftHashMap en un proyecto durante casi seis años y ha funcionado bien para este uso particular. Parece un poco largo pegar aquí, pero puede encontrar un ejemplo en jidesoft.swing.SoftHashMap y org.jvnet.substance.utils.SoftHashMap. Hay una versión modificada en org.pushingpixels.substance.internal.utils.SoftHashMap – jla
Si desea implementar una memoria caché softreferences son definitivamente una idea mejor que las referencias débiles, sino que pone toda su política de eliminación de la caché en manos del recolector de basura. que probablemente no es lo que quieres.
Si la política de eliminación de la caché es importante tu vas a tener que hacerlo por sus propios más probable es que utilizan referencias regulares. Sin embargo, tendrá que decidir cuándo expulsar los objetos y cuáles expulsar. Si sólo quiere perder cosas cuando se está quedando sin espacio de almacenamiento dinámico se puede consultar el espacio de almacenamiento dinámico disponible a través de:
Runtime.getRuntime().getFreeMemory();
memoria Luego, una vez libre cae por debajo de una cierta cantidad se puede iniciar cualquiera de los elementos que caen. O simplemente podría implementar un tamaño máximo para el caché y usarlo para decidir cuándo dejar caer cosas.
he aquí un LRU cache diseñado con O (1) tiempo de inserción, borrado y búsqueda, que tiene un número máximo configurable de elementos. Si quiere un caché, esta será una mejor solución que un SoftHashMap.
Los softreferences son una gran manera de crear una memoria caché growable. Entonces, la solución ideal sería usar un SoftHashMap junto con un caché de tamaño fijo regular. tener todas las inserciones en la caché de entrar en tanto el caché fijo y el mapa hash suave a continuación, hacer referencia a algo que acaba de ver si está en el mapa hash suave (y actualizar el tiempo de referencia en la memoria caché). de esta manera todos sus artículos más importantes (de acuerdo con su política elegida LRU, MFU, ...) Nunca será eliminado debido a que se hace referencia en el disco caché pero también se llevará a cabo a más cosas (sin control de la política), siempre ya que hay suficiente memoria.
Como explica Jeremy Manson, la eliminación temporizada (de MapMaker) es una buena solución a los problemas de SoftReferences: http://jeremymanson.blogspot.de/ 2009/07/how-hotspot-decide-to-clear_07.html De lo contrario, Apache Commons mantiene una implementación de LRUMap, mencionada a continuación por Joel. – Blaisorblade
estoy familiarizado con dos bibliotecas que ofrecen una implementación SoftHashMap:
Apache Commons: org.apache.commons.collections.map.ReferenceMap
Google Collections: com.google.common.collect .ReferenceMap
El mapa de referencia se eliminó de Google Collections. Usa MapMaker ahora. – Matthias
¿usted ha considerado el uso de un LRUMap en lugar de un HashMap suave? Obtienes más control sobre lo que se almacena (o al menos, cuánto).
LRU es el enfoque válido de la vieja escuela. Pero un caché de referencia suave debería hacer un mejor trabajo al adaptarse a picos y valles en el uso de memoria caché y memoria. Probablemente es por eso que el OP estaba pidiendo un análogo SoftReference de WeakReferenceMap en primer lugar. – Javier
- 1. ¿Hay un Trie en Java?
- 2. ¿Hay un OutputStream nulo en Java?
- 3. ¿Hay un contexto de solicitud en Java?
- 4. ¿Hay un iterador modificable en Java?
- 5. ¿Hay un equivalente a memcpy() en Java?
- 6. ¿Hay un equivalente de ucwords en java
- 7. ¿Hay equivalente epoll en Java?
- 8. ¿Hay un Java equivalente a libevent?
- 9. ¿Hay un Java equivalente a MISRA C?
- 10. ¿Hay un equivalente Java de frexp?
- 11. ¿Hay un convertidor de Java 7 a Java 6?
- 12. ¿Hay "punteros inteligentes" en Java?
- 13. ¿Hay un analizador de Java para el lenguaje Java?
- 14. ¿Hay un Java SDK para cygwin?
- 15. ¿Hay un diseñador GRATUITO de Java GUI?
- 16. ¿Hay un equivalente Java para LINQ?
- 17. ¿Hay un JDiff de Java 6 a Java 7?
- 18. ¿Hay un src.jar en OSX?
- 19. ¿Hay un análogo a Java IllegalStateException en Python?
- 20. ¿Hay un costo por método para crear objetos en Java?
- 21. ¿Hay algo así como un carácter comodín en Java?
- 22. ¿Hay un C# equivalente a File.separator en Java
- 23. ¿Hay un concepto de excepción interna en java
- 24. ¿Hay un equivalente de "Group Box" en Java Swing?
- 25. ¿hay alguna forma en java para crear un esquema xsd?
- 26. ¿Hay alguna función para truncar un doble en java?
- 27. ¿Hay un equivalente del método de Java igual en C++?
- 28. ¿Hay un destructor de C++ equivalente en Java?
- 29. ¿Hay un equivalente a java @SuppressWarnings en JSP
- 30. ¿Hay un OutputStream en el bloqueo de Java? (Sockets)
Otra aplicación útil es propio 'sun.security.util.Cache' de OpenJDK, que soporta un tamaño máximo, tiempo de vida limitado en el tiempo, y una selección de referencias normales frente a SoftReferences.La versión en Java 7 mapea Objetos a objetos; la versión en Java 8 es genérica. Obviamente, no deberíamos importar cosas 'sun' directamente, pero el código es GPL'd y se puede copiar si se quiere un punto de partida. –