2011-07-06 18 views
6

por la documentación de la guayaba de MapMaker.softValues():¿Cuáles son las "consecuencias prácticas" del uso de referencias suaves?

Advertencia: en la mayoría de circunstancias, es mejor establecer un tamaño máximo por-caché en lugar de utilizar referencias suaves. Solo debe usar este método si está familiarizado con las consecuencias prácticas de las referencias suaves.

Tengo un conocimiento intermedio de las referencias suaves: su comportamiento, usos y su contrato con la recolección de basura. Sin embargo, me pregunto cuáles son estas consecuencias prácticas a las que alude el documento. ¿Por qué es mejor usar el tamaño máximo en lugar de las referencias suaves? ¿Los algoritmos y el comportamiento de las referencias suaves no hacen que su uso sea más eficiente que un techo codificado, en términos de implementación de un caché?

Respuesta

4

Creo que lo único que están aludiendo es que debe estar preparado para el uso máximo de memoria y potencialmente más actividad de gc, si utiliza un mapa de referencia suave, ya que las referencias solo se generan porque la memoria debe liberarse arriba.

Si sabe que solo necesita los últimos n valores en la memoria caché, utilizar LRU Cache es un enfoque más sencillo, con un uso más predecible de los recursos para una aplicación en ejecución.

Además, según this, parece que hay sutiles diferencias de comportamiento entre las JVM -server y -client.

Sun JRE no trata las referencias suaves de forma diferente a WeakReferences. Nosotros intentamos aferrarnos al objeto al que hace referencia un SoftReference si no tiene presión en la memoria disponible. Un detalle: la política para la "-client" y "-server" de JRE son diferente: la -client JRE intenta mantener su huella pequeña por prefiriendo borrar SoftReferences en lugar de ampliar el montón, mientras que el - el servidor JRE intenta mantener el rendimiento alto de al preferir expandir el montón (si es posible) en lugar de que borrar SoftReferences. Un tamaño no sirve para todos.

+0

Gracias, puedo ver las ventajas de LRU más claramente ahora. Tomando esta ruta, ¿hay alguna manera de garantizar que ningún objeto fuertemente alcanzable sea desalojado (usando MapMaker)? –

4

Uno de los problemas prácticos con el uso de SoftReferences es que tienden a descartarse todos a la vez. La razón por la que tienes un caché es para proporcionar un rendimiento bastante bueno, la mayoría de las veces.

Sin embargo, el uso de SoftReferences para un caché puede significar que una vez que la aplicación se haya detenido para un GC, se ejecutará lentamente hasta que se reconstruya el caché. Es decir, justo en el momento en que necesita la aplicación ponerse al día.

Nota: Puede usar un LinkedHashMap as an LRU cache, no tiene por qué ser complejo.

+1

+1 No me di cuenta de que generalmente todos fueron descartados a la vez. Gracias por la ayuda –

+1

Una WeakReference se puede descartar en un GC, una SoftReference se descartará a discreción de los GC. Sin embargo, es muy probable que si uno tiene que ir, todos sean recuperados. es decir, no es una degradación elegante. –

Cuestiones relacionadas