8.1 Referencias débiles en Java

Hay varios tipos de referencias en Java.

Hay StrongReference : estos son los enlaces más comunes que creamos todos los días.

Object object = new Object();//created an object
object = null;//can now be garbage collected

Y hay tres tipos de enlaces "especiales": SoftReference, WeakReference, PhantomReference. De hecho, solo hay una diferencia entre todos los tipos de enlaces: el comportamiento del GC con los objetos a los que se refieren. Discutiremos los detalles específicos de cada tipo de enlace con más detalle más adelante, pero por ahora, el siguiente conocimiento será suficiente:

  • SoftReference es una referencia suave, si el GC ve que solo se puede acceder a un objeto a través de una cadena de referencias suaves, lo eliminará de la memoria. Tal vez.
  • WeakReference : una referencia débil, si el GC ve que solo se puede acceder a un objeto a través de una cadena de referencias débiles, lo eliminará de la memoria.
  • PhantomReference es una referencia fantasma, si el GC ve que un objeto solo está disponible a través de una cadena de referencias fantasma, lo eliminará de la memoria. Después de varias ejecuciones de GC.

También se puede decir que los tipos de enlaces tienen cierto grado de suavidad:

  • Un enlace fijo regular es cualquier variable de un tipo de referencia. No limpiado por el recolector de basura antes de que no se use.
  • Referencia suave . El objeto no hará que se agote toda la memoria; se garantiza que se eliminará antes de que ocurra un OutOfMemoryError. Tal vez antes, dependiendo de la implementación del recolector de basura.
  • Referencia débil . Más débil suave. No impide que el objeto sea desechado, el recolector de basura ignora tales referencias.
  • Referenciafantasma . Se utiliza para el procesamiento de "muerte" de un objeto: el objeto está disponible después de la finalización hasta que se recolecta como basura.

Si aún no está claro cuál es la diferencia, no se preocupe, pronto todo encajará. Los detalles están en los detalles, y los detalles seguirán.

8.2 WeakReference y SoftReference en Java

Primero, veamos la diferencia entre WeakReference y SoftReference en Java.

En resumen, el recolector de basura liberará la memoria de un objeto si solo las referencias débiles apuntan a él. Si SoftReferences apunta al objeto, entonces la memoria se desasigna cuando la JVM tiene una gran necesidad de memoria.

Esto le da una ventaja definitiva a SoftReference sobre la referencia fuerte en ciertos casos. Por ejemplo, SoftReference se usa para implementar un caché de aplicación, por lo que lo primero que hará la JVM es eliminar objetos a los que solo apuntan SoftReferences.

WeakReference es excelente para almacenar metadatos, como almacenar una referencia a un ClassLoader. Si no se carga ninguna clase, entonces no debe consultar ClassLoader. Esta es la razón por la que WeakReference hace posible que el recolector de basura haga su trabajo en el ClassLoader tan pronto como se elimine la última referencia fuerte.

Ejemplo de referencia débil en Java:

// some object
Student student = new Student();

// weak reference to it
WeakReference weakStudent = new WeakReference(student);

// now the Student object can be garbage collected
student = null;

Ejemplo de SoftReference en Java:

// some object
Student student = new Student();

// weak reference to it
SoftReference softStudent = new SoftReference(student)

// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;

8.3 PhantomReference en Java

La instancia de PhantomReference se crea de la misma manera que en los ejemplos de WeakReference y SoftReference, pero rara vez se usa.

Una PhantomReference se puede recolectar como basura si el objeto no tiene referencias fuertes (Strong), débiles (WeakReference) o blandas (SoftReference).

Puede crear un objeto de referencia fantasma como este:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference se puede utilizar en situaciones en las que finalizar() no tiene sentido. Este tipo de referencia es diferente de otros tipos porque no está diseñado para acceder a un objeto. Es una señal de que el objeto ya se ha finalizado y el recolector de elementos no utilizados está listo para reclamar su memoria.

Para hacer esto, el recolector de basura lo coloca en una ReferenceQueue especial para su posterior procesamiento. ReferenceQueue es donde se colocan las referencias de objetos para liberar memoria.

Las referencias fantasma son una forma segura de saber que un objeto se ha eliminado de la memoria. Por ejemplo, considere una aplicación que maneja imágenes grandes. Digamos que queremos cargar una imagen en la memoria cuando ya está en la memoria, que está lista para la recolección de elementos no utilizados. En este caso, queremos esperar a que el recolector de basura elimine la imagen anterior antes de cargar la nueva imagen en la memoria.

Aquí PhantomReference es una opción flexible y segura. La referencia a la imagen anterior se pasará a ReferenceQueue después de que se destruya el objeto de imagen anterior. Una vez que tengamos este enlace, podemos cargar la nueva imagen en la memoria.

undefined
3
Опрос
Working with memory in Java,  18 уровень,  7 лекция
недоступен
Working with memory in Java
Working with memory in Java