En Java existen cuatro tipos de referencias diferenciadas en la forma en que son recolectadas como basura.
- Referencias fuertes
- Referencias débiles
- Referencias blandas
- Referencias fantasma
Prerrequisito: Recolección de Basura
- Referencias fuertes: este es el tipo/clase predeterminado de objeto de referencia. Cualquier objeto que tenga una referencia fuerte activa no es elegible para la recolección de elementos no utilizados. El objeto se recolecta como basura solo cuando la variable a la que se hace referencia fuerte apunta a nulo.
MyClass obj = new MyClass();
Aquí el objeto ‘obj’ es una fuerte referencia a la instancia recién creada de MyClass, actualmente obj es un objeto activo, por lo que no se puede recolectar basura.
obj = null; //'obj' object is no longer referencing to the instance. So the 'MyClass type object is now available for garbage collection.
// Java program to illustrate Strong reference
class
Gfg
{
//Code..
}
public
class
Example
{
public
static
void
main(String[] args)
{
//Strong Reference - by default
Gfg g =
new
Gfg();
//Now, object to which 'g' was pointing earlier is
//eligible for garbage collection.
g =
null
;
}
}
- Referencias débiles: los objetos de referencia débiles no son el tipo/clase predeterminado de objeto de referencia y deben especificarse explícitamente al usarlos.
- Este tipo de referencia se usa en WeakHashMap para hacer referencia a los objetos de entrada.
- Si JVM detecta un objeto con solo referencias débiles (es decir, sin referencias fuertes o blandas vinculadas a ningún objeto), este objeto se marcará para la recolección de elementos no utilizados.
- Para crear dichas referencias se utiliza la clase java.lang.ref.WeakReference .
- Estas referencias se utilizan en aplicaciones en tiempo real al establecer una DBConnection que puede ser limpiada por Garbage Collector cuando se cierra la aplicación que utiliza la base de datos.
//Java Code to illustrate Weak reference
import
java.lang.ref.WeakReference;
class
Gfg
{
//code
public
void
x()
{
System.out.println(
"GeeksforGeeks"
);
}
}
public
class
Example
{
public
static
void
main(String[] args)
{
// Strong Reference
Gfg g =
new
Gfg();
g.x();
// Creating Weak Reference to Gfg-type object to which 'g'
// is also pointing.
WeakReference<Gfg> weakref =
new
WeakReference<Gfg>(g);
//Now, Gfg-type object to which 'g' was pointing earlier
//is available for garbage collection.
//But, it will be garbage collected only when JVM needs memory.
g =
null
;
// You can retrieve back the object which
// has been weakly referenced.
// It successfully calls the method.
g = weakref.get();
g.x();
}
}
Producción:
GeeksforGeeks GeeksforGeeks
Se pueden alistar dos niveles diferentes de debilidad: Soft y Phantom
- Referencias suaves: en la referencia suave, incluso si el objeto está libre para la recolección de basura, entonces tampoco se recolecta la basura, hasta que JVM necesita memoria. Los objetos se borran de la memoria cuando JVM se queda sin memoria. Para crear tales referencias Se utiliza la clase java.lang.ref.SoftReference .
//Code to illustrate Soft reference
import
java.lang.ref.SoftReference;
class
Gfg
{
//code..
public
void
x()
{
System.out.println(
"GeeksforGeeks"
);
}
}
public
class
Example
{
public
static
void
main(String[] args)
{
// Strong Reference
Gfg g =
new
Gfg();
g.x();
// Creating Soft Reference to Gfg-type object to which 'g'
// is also pointing.
SoftReference<Gfg> softref =
new
SoftReference<Gfg>(g);
// Now, Gfg-type object to which 'g' was pointing
// earlier is available for garbage collection.
g =
null
;
// You can retrieve back the object which
// has been weakly referenced.
// It successfully calls the method.
g = softref.get();
g.x();
}
}
Producción:
GeeksforGeeks GeeksforGeeks
- Referencias fantasma: los objetos a los que se hace referencia mediante referencias fantasma son elegibles para la recolección de elementos no utilizados. Pero, antes de eliminarlos de la memoria, JVM los coloca en una cola llamada ‘cola de referencia’. Se colocan en una cola de referencia después de llamar al método finalize() en ellos. Para crear tales referencias , se usa la clase java.lang.ref.PhantomReference .
//Code to illustrate Phantom reference
import
java.lang.ref.*;
class
Gfg
{
//code
public
void
x()
{
System.out.println(
"GeeksforGeeks"
);
}
}
public
class
Example
{
public
static
void
main(String[] args)
{
//Strong Reference
Gfg g =
new
Gfg();
g.x();
//Creating reference queue
ReferenceQueue<Gfg> refQueue =
new
ReferenceQueue<Gfg>();
//Creating Phantom Reference to Gfg-type object to which 'g'
//is also pointing.
PhantomReference<Gfg> phantomRef =
null
;
phantomRef =
new
PhantomReference<Gfg>(g,refQueue);
//Now, Gfg-type object to which 'g' was pointing
//earlier is available for garbage collection.
//But, this object is kept in 'refQueue' before
//removing it from the memory.
g =
null
;
//It always returns null.
g = phantomRef.get();
//It shows NullPointerException.
g.x();
}
}
Error de tiempo de ejecución:
Exception in thread "main" java.lang.NullPointerException at Example.main(Example.java:31)
Producción:
GeeksforGeeks
Este artículo es una contribución de Pratik Agarwal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA