¿Cómo hacer que el objeto sea elegible para la recolección de basura en Java?

Un objeto es elegible para ser recolectado como basura si su variable de referencia se pierde del programa durante la ejecución. A veces también se les llama objetos inalcanzables .

¿Qué es la referencia de un objeto?

El operador new asigna dinámicamente memoria para un objeto y devuelve una referencia a él. Esta referencia es la dirección en memoria del objeto asignado por new. Una referencia es una dirección que indica dónde se almacenan las variables, métodos, etc. de un objeto.

Los objetos no se utilizan realmente cuando se asignan a una variable o se pasan como argumento a un método. Las referencias a objetos se utilizan en todas partes. Ejemplo:

Box mybox =  new Box();   //referencing to object

Rol de un objeto inalcanzable en Java

En Java, la memoria asignada en tiempo de ejecución, es decir, el área de almacenamiento dinámico, puede liberarse mediante el proceso de recolección de elementos no utilizados. No es más que un método para liberar la memoria que no está siendo utilizada por el programador. Solo los objetos que ya no tienen referencia a ellos son elegibles para la recolección de basura en Java.

Formas de hacer que un objeto sea elegible para la recolección de basura:

Tenga en cuenta que el objeto no puede convertirse en candidato para la recolección de basura hasta que se descarten todas las referencias a él.

  1. Objeto creado dentro de un método: cuando se llama a un método, va dentro del marco de la pila. Cuando el método se extrae de la pila, todos sus miembros mueren y si se crearon algunos objetos dentro de él, estos objetos se vuelven inalcanzables o anónimos después de la ejecución del método y, por lo tanto, se vuelven elegibles para la recolección de basura
    . Ejemplo:

    /* Java program to demonstrate that 
    objects created inside a method will becomes
    eligible for gc after method execution terminate */
      
    class Test
    {
          
        // to store object name
        String obj_name;
          
        public Test(String obj_name) 
        {
            this.obj_name = obj_name;
        }
          
        static void show()
        {
            //object t1 inside method becomes unreachable when show() removed
            Test t1 = new Test("t1"); 
            display();
              
        }
        static void display()
        {
            //object t2 inside method becomes unreachable when display() removed
            Test t2 = new Test("t2"); 
        }
          
        // Driver method
        public static void main(String args[])
        {
            // calling show()
            show();
              
            // calling garbage collector
            System.gc();
        }
          
        @Override
        /* Overriding finalize method to check which object
        is garbage collected */
        protected void finalize() throws Throwable 
        {
            // will print name of object
            System.out.println(this.obj_name + " successfully garbage collected");
        }
    }

    Producción:

    t2 successfully garbage collected
    t1 successfully garbage collected
    

    Nota: si un método devuelve el objeto creado dentro de él y almacenamos esta referencia de objeto utilizando una variable de tipo de referencia, entonces ya no es elegible para la recolección de elementos no utilizados.

  2. Reasignación de la variable de referencia: cuando la identificación de referencia de un objeto se relaciona con la identificación de referencia de algún otro objeto, el objeto anterior ya no tiene ninguna referencia a él y se vuelve inalcanzable y, por lo tanto, se vuelve elegible para la recolección de basura. Ejemplo:

    /* Java program to demonstrate gc
     when one object referred to other object */
      
    class Test
    {
        // to store object name
        String obj_name;
          
        public Test(String obj_name) 
        {
            this.obj_name = obj_name;
        }
          
        // Driver method
        public static void main(String args[])
        {
            Test t1 = new Test("t1");
            Test t2 = new Test("t2");
              
            //t1 now referred to t2
            t1 = t2;
              
            // calling garbage collector
            System.gc();
        }
          
        @Override
        /* Overriding finalize method to check which object
         is garbage collected */
        protected void finalize() throws Throwable 
        {
            // will print name of object
            System.out.println(this.obj_name + " successfully garbage collected");
        }
    }

    Producción:

    t1 successfully garbage collected
    
  3. Anulación de la variable de referencia: cuando todas las variables de referencia de un objeto se cambian a NULL, se vuelve inalcanzable y, por lo tanto, se vuelve elegible para la recolección de basura. Ejemplo:

    /* Java program to demonstrate gc
     when object reference changed to NULL */
      
    class Test
    {
        // to store object name
        String obj_name;
          
        public Test(String obj_name) 
        {
            this.obj_name = obj_name;
        }
          
        // Driver method
        public static void main(String args[])
        {
            Test t1 = new Test("t1");
               
            /* t1 being used for some purpose in program */
       
            /* When there is no more use of t1, make the object
               referred by t1 eligible for garbage collection */        
            t1 = null;
       
            // calling garbage collector
            System.gc();
        }
          
        @Override
        /* Overriding finalize method to check which object
         is garbage collected */
        protected void finalize() throws Throwable 
        {
            // will print name of object
            System.out.println(this.obj_name + " successfully garbage collected");
        }
    }

    Producción:

    t1 successfully garbage collected
    
  4. Objeto anónimo: la identificación de referencia de un objeto anónimo no se almacena en ningún lugar. Por lo tanto, se vuelve inalcanzable.
    Ejemplo:

    /* Java program to demonstrate gc
     of anonymous objects */
      
    class Test
    {
        // to store object name
        String obj_name;
          
        public Test(String obj_name) 
        {
            this.obj_name = obj_name;
        }
          
        // Driver method
        public static void main(String args[])
        {
            //anonymous object without reference id
            new Test("t1"); 
       
            // calling garbage collector
            System.gc();
        }
          
        @Override
        /* Overriding finalize method to check which object
         is garbage collected */
        protected void finalize() throws Throwable 
        {
            // will print name of object
            System.out.println(this.obj_name + " successfully garbage collected");
        }
    }

    Producción:

    t1 successfully garbage collected
    

Artículo Relacionado: Isla del Aislamiento

Este artículo es una contribución de Apoorva Singh y Gaurav Miglani . 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 *