Conocer los conceptos de referencias débiles y suaves es diferente de cómo usarlos. Todos sabemos que el recolector de basura reclama la memoria de los objetos que cumplen con los criterios de reciclaje, pero no todos los programadores saben que los criterios de reciclaje depende del tipo de referencia que apunte al objeto. Esta es la principal diferencia entre referencias débiles y referencias suaves en Java. Si un objeto solo tiene una referencia débil que le apunta, el recolector de basura recicla el objeto inmediatamente, lo cual es una forma urgente de reciclarlo. Relativamente, si hay referencias suaves que apuntan a estos objetos, solo se reciclarán si el JVM requiere memoria. El comportamiento especial de las citas débiles y suaves los hace muy útiles en algunos casos. Por ejemplo: las referencias suaves se pueden usar bien para implementar caché. Las referencias débiles son muy adecuadas para almacenar metadatos, como almacenar referencias de cargador de clases. Si no se carga ninguna clase, tampoco hay referencia al cargador de clases. Una vez que se elimina la última referencia fuerte, solo se reciclará el cargador de clases de referencia débil. En este artículo, hablaremos sobre diferentes tipos de referencias de Java, como: referencia sólida y fantomreferencia.
Referencias débiles versus referencias suaves en Java
Hay cuatro tipos de referencias en Java:
1. Referencia fuerte
2.
3. Softreference
4. Phantomreference
Las referencias fuertes son las referencias más simples que usamos en la programación, como la variable s en la cadena de código S = "ABC" es una sólida referencia al objeto de cadena "ABC". Cualquier objeto señalado por una referencia fuerte no puede ser reciclado por el recolector de basura, y estos objetos son necesarios en el programa. Las referencias débiles están representadas por Java.lang.ref.weakReference Class Class Class, y puede crear referencias débiles utilizando el siguiente código:
La copia del código es la siguiente:
Contador de contador = nuevo contador ();
Débilreference <Artain> DeakCounter = New WeakReference <Arden> (contador);
contador = nulo;
Ahora, siempre que asigne un valor nulo al contador del objeto de referencia fuerte, el objeto puede ser reciclado por el recolector de basura. Debido a que el objeto ya no contiene otras referencias fuertes en este momento, incluso los puntos débiles para el objeto no pueden evitar que el recolector de basura recicla el objeto. Por el contrario, si el objeto contiene una referencia suave, el objeto de contador no se recicla inmediatamente a menos que el JVM requiera memoria. Las referencias suaves en Java están representadas por la clase Java.Lang.Ref.SOFTreference.
La copia del código es la siguiente:
Contador Prime = nuevo contador ();
Softreference Soft = New Softreference (Prime);
Prime = null; // Ahora el objeto de contador es elegible para la recolección de basura, pero solo se recolecta cuando JVM necesita memoria
Después de que la fuerte referencia está vacía, el segundo comportamiento del código, el contador, crea una referencia suave. Dada esta diferencia entre referencias suaves y referencias débiles, las referencias suaves son más adecuadas para los mecanismos de almacenamiento en caché, mientras que las referencias débiles son más adecuadas para almacenar metadatos. Otro ejemplo del uso de referencias débiles es Weakhashmap, que es otra implementación de la interfaz MAP además de Hashmap y Treemap. Deakhashmap tiene una característica: las claves en el mapa están encapsuladas como referencias débiles, lo que significa que una vez que se elimina la fuerte referencia, las referencias débiles dentro del Débilhashmap no pueden evitar que el objeto sea recolectado por el recolector de basura.
La referencia virtual es la tercera referencia disponible en el paquete java.lang.ref, representado por la clase java.lang.ref.phantomreference. Los objetos con referencias virtuales pueden ser reciclados por el recolector de basura en cualquier momento. Similar a referencias débiles y referencias suaves, puede crear referencias virtuales a través del siguiente código:
La copia del código es la siguiente:
DigitalCounter Digit = new DigitalCounter ();
Phantomreference Phantom = New Phantomreference (dígito);
dígito = nulo;
Una vez que se elimina la fuerte referencia, el objeto DigitalCounter en la tercera fila puede ser reciclado por el recolector de basura en cualquier momento. Debido a que solo hay una referencia virtual que apunta al objeto, la referencia virtual no puede evitar que el recolector de basura recupere el objeto.
Además de comprender las referencias débiles, las referencias suaves, las referencias virtuales y los débiles, también debe comprender referencequeue. En el proceso de creación de referencias débiles, referencias suaves y referencias virtuales, puede proporcionar la referencia de referencia de referencia a través del siguiente código:
La copia del código es la siguiente:
Referenceue refQueue = new RefectionQueue ();
DigitalCounter digit = new DigitalCounter ();
Phantomreference <DigitalCounter> Phantom = new Phantomreference <DigitalCounter> (dígito, Refqueue);
Las instancias de referencia se agregan a la cola de referencia, y puede reciclar objetos consultando la cola de referencia en cualquier momento. El ciclo de vida de un objeto se puede describir en la figura a continuación: