Tipos de referencias en Java

En Java existen cuatro tipos de referencias diferenciadas en la forma en que son recolectadas como basura.

  1. Referencias fuertes
  2. Referencias débiles
  3. Referencias blandas
  4. 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.          
    

    Fuertes referencias en Java

    // 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.

    referencias-débiles-en-java

    //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 .
    referencias-suaves-en-java

    //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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *