¿Qué tipos de referencias existen en Java y cuáles son sus características?
sobes.tech AI
Respuesta de la IA
En Java, existen tres tipos principales de referencias (variables de referencia), que difieren en el comportamiento del recolector de basura:
- Referencia Fuerte (Strong Reference)
- Referencia Suave (Soft Reference)
- Referencia Débil (Weak Reference)
- Referencia Fantasma (Phantom Reference)
Referencia Fuerte (Strong Reference)
Este es el tipo de referencia más común. Un objeto al que apunta una referencia fuerte no será recolectado por el recolector de basura mientras exista al menos una referencia fuerte a él.
// Creación de un objeto y una referencia fuerte a él
Object myObject = new Object();
Referencia Suave (Soft Reference)
Una referencia suave apunta a un objeto que puede ser recolectado por el recolector de basura si la JVM necesita memoria. Los objetos a los que solo apuntan referencias suaves no serán recolectados garantizadamente hasta que la JVM tenga una necesidad urgente de liberar memoria. Se usa comúnmente para cachés.
import java.lang.ref.SoftReference;
// Creación de un objeto
Object data = new Object();
// Creación de una referencia suave al objeto
SoftReference<Object> softRef = new SoftReference<>(data);
// El objeto data puede ser recolectado si no hay suficiente memoria
// Si el objeto no ha sido recolectado, se puede recuperar
Object retrievedData = softRef.get();
Referencia Débil (Weak Reference)
Una referencia débil apunta a un objeto que puede ser recolectado por el recolector de basura en cualquier momento si no hay referencias fuertes a él. Las referencias débiles se usan a menudo para implementar cachés, donde los elementos pueden ser descartados en caso de falta de memoria.
import java.lang.ref.WeakReference;
// Creación de un objeto
Object cacheEntry = new Object();
// Creación de una referencia débil al objeto
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// El objeto cacheEntry puede ser recolectado en cualquier momento
// Verificación si el objeto ha sido recolectado
if (weakRef.get() == null) {
// El objeto fue recolectado
}
Referencia Fantasma (Phantom Reference)
Una referencia fantasma se usa en conjunto con ReferenceQueue para realizar acciones antes de que el objeto sea completamente eliminado de la memoria. No es posible obtener el objeto a través de una referencia fantasma (get() siempre devuelve null). Se usa principalmente para gestionar recursos que requieren limpieza especial.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Creación de un objeto para seguimiento
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Creación de una referencia fantasma y vinculación con la cola
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// En un hilo separado, se puede monitorear la cola referenceQueue
// Cuando el objeto resource esté listo para ser eliminado, la referencia fantasma aparecerá en la cola
Características y comparación:
| Tipo de referencia | Recolector de basura | Obtener objeto con get() |
Uso |
|---|---|---|---|
| Referencia Fuerte | No recolecta | Sí | Uso normal |
| Referencia Suave | Puede recolectar | Sí (si no ha sido recolectado) | Caché (cuando hay falta de memoria) |
| Referencia Débil | Puede recolectar | Sí (si no ha sido recolectado) | Caché (si no hay referencias fuertes) |
| Referencia Fantasma | Puede recolectar | No (siempre null) | Limpieza de recursos antes de eliminar (con ReferenceQueue) |