Salida de programas Java | Conjunto 10 (Recolección de basura)

Requisito previo: recolección de basura en Java

Nivel de dificultad: Intermedio En Java, el módulo Garbage Collector
se encarga de la destrucción de objetos y los objetos que no tienen ninguna referencia a ellos son elegibles para la recolección de basura. A continuación se presentan algunas preguntas de salida importantes sobre la recolección de basura. Prediga la salida de los siguientes programas Java:

  • Programa 1:

    public class Test
    {
        public static void main(String[] args) throws InterruptedException
        {
            String str = new String("GeeksForGeeks");
                  
            // making str eligible for gc
            str = null
                  
            // calling garbage collector
            System.gc(); 
                  
            // waiting for gc to complete
            Thread.sleep(1000); 
          
            System.out.println("end of main");
        }
      
        @Override
        protected void finalize() 
        {
            System.out.println("finalize method called");
        }
    }

    Producción:

    end of main
    

    Explicación: sabemos que Garbage Collector llama al método finalize() en un objeto antes de destruirlo. Pero aquí, el truco es que str es un objeto de clase String, no la clase Test. Por lo tanto, el método finalize() de la clase String (si se anula en la clase String) se llama en str. Si una clase no anula el método de finalización, entonces, por defecto, se llama al método finalize() de la clase Object.

  • Programa 2:

    public class Test
    {
        public static void main(String[] args) throws InterruptedException
        {
            Test t = new Test();
                  
            // making t eligible for garbage collection
            t = null
                  
            // calling garbage collector
            System.gc(); 
                  
            // waiting for gc to complete
            Thread.sleep(1000); 
          
            System.out.println("end main");
        }
      
        @Override
        protected void finalize() 
        {
            System.out.println("finalize method called");
            System.out.println(10/0);
        }
          
    }

    Producción:

    finalize method called
    end main
    

    Explicación:
    cuando Garbage Collector llama al método finalize() en un objeto, ignora todas las excepciones generadas en el método y el programa terminará normalmente.

  • Programa 3:

    public class Test
    {
        static Test t ;
          
        static int count =0;
          
        public static void main(String[] args) throws InterruptedException
        {
            Test t1 = new Test();
                  
            // making t1 eligible for garbage collection
            t1 = null; // line 12
                  
            // calling garbage collector
            System.gc(); // line 15
                  
            // waiting for gc to complete
            Thread.sleep(1000); 
          
            // making t eligible for garbage collection,
            t = null; // line 21
                  
            // calling garbage collector
            System.gc(); // line 24
          
            // waiting for gc to complete
            Thread.sleep(1000); 
                  
            System.out.println("finalize method called "+count+" times");
              
        }
          
        @Override
        protected void finalize() 
        
            count++;
              
            t = this; // line 38
                  
        }
          
    }

    Producción:

    finalize method called 1 times
    

    Explicación :
    después de la ejecución de la línea 12, t1 se vuelve elegible para la recolección de elementos no utilizados. Entonces, cuando llamamos al recolector de basura en la línea 15, Garbage Collector llamará al método finalize() en t1 antes de destruirlo. Pero en el método de finalización, en la línea 38, nuevamente estamos haciendo referencia al mismo objeto por t, por lo que después de la ejecución de la línea 38, este objeto ya no es elegible para la recolección de elementos no utilizados. Por lo tanto, Garbage Collector no destruirá el objeto.

    Ahora nuevamente en la línea 21, estamos haciendo que el mismo objeto sea elegible para la recolección de basura una vez más. Aquí, tenemos que aclarar un hecho sobre Garbage Collector, es decir, llamará al método finalize() en un objeto en particular exactamente una vez. Dado que en este objeto, ya se ha llamado al método finalize(), ahora Garbage Collector lo destruirá sin volver a llamar al método finalize().

  • Programa 4:

    public class Test
    {
        public static void main(String[] args)
        {
            // How many objects are eligible for 
            // garbage collection after this line?
            m1();  // Line 5
        }
      
        static void m1() 
        {
            Test t1 = new Test();
            Test t2 = new Test();
        
    }

    Pregunta:
    ¿Cuántos objetos son elegibles para la recolección de elementos no utilizados después de la ejecución de la línea 5?
    Responder :

    2
    

    Explicación:
    dado que t1 y t2 son objetos locales del método m1(), se vuelven elegibles para la recolección de basura después de la ejecución completa del método, a menos que se devuelva alguno de ellos.

  • Programa 5:

    public class Test
    {
        public static void main(String [] args) 
        {
            Test t1 = new Test();
            Test t2 = m1(t1); // line 6
            Test t3 = new Test();
            t2 = t3; // line 8
              
        }
          
        static Test m1(Test temp) 
        {
            temp = new Test();
            return temp;
        }
    }

    Pregunta:
    ¿Cuántos objetos son elegibles para la recolección de basura después de la ejecución de la línea 8?
    Responder :

    1
    

    Explicación:
    en el momento en que se ejecutó la línea 8, el único objeto sin referencia es el generado, es decir, como resultado de la línea 6. Recuerde que » Java se pasa estrictamente por valor «, por lo que la variable de referencia t1 no se ve afectada por m1( ) método. Podemos verificarlo usando el método finalize(). La declaración «System.out.println(this.hashcode())» en el método finalize() imprime el valor del código hash del objeto en el que se llama al método finalize(), y luego simplemente compara el valor con los valores del código hash de otros objetos creados en el método principal .

Este artículo es una contribución de Gaurav Miglani . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@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 *