2010-03-10 9 views
13

¿Qué es un caso de uso para una referencia suave en Java? ¿Sería útil para la basura recolectar elementos no críticos cuando una JVM se ha quedado sin memoria para liberar suficientes recursos como para volcar información crítica antes de apagar la JVM?¿Qué es un caso de uso para una referencia suave en Java?

Se les llama referencias suaves porque son suaves y se rompen cuando se "someten a estrés", es decir: se ha agotado la memoria de la JVM. Comprendo referencias débiles y referencias fantasmas, pero no realmente cuando se necesitarían.

Respuesta

16

Un uso es para el almacenamiento en caché. Imagine que desea mantener un caché en memoria de objetos grandes, pero no desea que ese caché consuma memoria que podría usarse para otros fines (porque el caché siempre puede reconstruirse). Al mantener un caché de referencias suaves a los objetos, los objetos referenciados pueden ser liberados por la JVM y la memoria que ocuparon reutilizados para otros fines. La memoria caché solo necesitaría eliminar las referencias blandas rotas cuando las encuentre.

Otro uso puede ser para mantener las imágenes de la aplicación en un dispositivo con memoria limitada, como un teléfono móvil. A medida que el usuario abre las aplicaciones, las imágenes de la aplicación anterior podrían mantenerse como referencias suaves para que puedan borrarse si la memoria es necesaria para otra cosa, pero seguirá estando allí si no hay demanda de memoria. Esto permitirá al usuario regresar a la aplicación más rápidamente si no hay presión en la memoria y permitir que la memoria de la aplicación anterior sea recuperada si se necesita para otra cosa.

+0

solo para agregar, parece que las referencias suaves son, en principio, las mismas que las del sistema de gestión de memoria de Linux (o de cualquier otro sistema operativo) donde las páginas se cargan a pedido. Solo que Linux puede implementar varios algoritmos de reemplazo de página. ¿Qué pasa con Java Garbage Collector? ¿Se usa (o se puede configurar) para usar patrones de uso de objetos para seleccionar la Referencia suave para Recolectar basura? –

3

El mejor ejemplo que puedo pensar es un caché. Puede que no le importe descargar las entradas más antiguas en la memoria caché si la memoria se convierte en un problema. El almacenamiento en caché de gráficos de objetos grandes también puede hacer que esto sea probable.

16

This article me dio una buena comprensión de cada uno de ellos (referencias débiles, suaves y fantasmas). He aquí un resumen a citar:

Un débil referencia, en pocas palabras, es una referencia que no es lo suficientemente fuerte como para forzar un objeto de permanecer en la memoria. Las referencias débiles le permiten aprovechar la capacidad del recolector de basura para determinar la accesibilidad para usted, por lo que no tiene que hacerlo usted mismo.

A referencia suave es exactamente como una referencia débil, excepto que es menos deseoso de tirar el objeto al que se refiere. Un objeto que solo es débilmente alcanzable (las referencias más potentes al mismo son WeakReferences) se descartará en el siguiente ciclo de recolección de basura, pero un objeto que se puede alcanzar suavemente generalmente se mantendrá durante un tiempo.

A referencia fantasma es bastante diferente de SoftReference o WeakReference. Su control sobre su objeto es tan tenue que ni siquiera puede recuperar el objeto; su método get() siempre devuelve null. El único uso para dicha referencia es hacer un seguimiento de cuándo se pone en cola en un ReferenceQueue, ya que en ese momento sabes que el objeto al que apuntaba está muerto.

+0

+1 para el resumen :) Ese es el tipo de texto que estoy buscando: P En cuanto a las referencias fantasmas ... se ve muy extraño, creo que su propósito principal es servir como un artefacto para herramientas de depuración o cosas como ese. – OscarRyz

+1

@Oscar: las referencias Phantom también se pueden usar para crear una finalización más segura que el método estándar 'finalize' (lo leí en un texto de ayuda de la herramienta de creación de perfiles pero encontré algunas discusiones aquí - http://code-o-matic.blogspot.com /2009/01/subtleties-of-phantomreference-and.html). –

0

En este post se puede encontrar un ejemplo de cómo se puede usar una referencia de software como caché.

Cuestiones relacionadas