RSS

El recolector de basura

20 Oct

Muchos lenguajes de programación permiten asignar memoria dinámica en tiempo de ejecución pero es el programador el que tiene la responsabilidad de liberarla.

Sin embargo, Java proporciona un hilo en el nivel del sistema que administra esta memoria, busca la que está en desuso y la libera. Es el recolector de basura o Garbage Collector (GC).

Cuándo se ejecuta:
El GC está bajo el control de la JVM y ella decide cuándo ejecutarlo. Dentro de un programa se puede solicitar la ejecución pero no hay ninguna garantía de que se ejecute.

Cómo funciona:
Los modelos de reciclaje de la memoria pueden variar considerablemente en cada implementación de la JVM. Lo que debemos tener claro es cuándo un objeto es elegible por el GC.

Un objeto es elegible cuando ningún thread vivo puede acceder a él.


Cómo hacer un objeto elegible:

  • Estableciendo la referencia a null:
    Cuando asignamos la referencia de un objeto a null estamos perdiendo cualquier posibilidad de acceder a él.

    public class aNull{
        public static void main (String[] args){
            Integer a = new Integer(10); //1
            a = null; //2
           //ahora el objeto Integer(10) es elegible por el GC.
        }
    }
    

    //1 Creación del objeto.

    //2 La referencia ya no apunta al objeto. La referencia es igual a null. El objeto es ahora elegible por el GC.

  • Reasignando la referencia:
    Cuando hacemos que la referencia que apunta a un objeto apunte a otro distinto dejando el primero inaccesible.

    public class Reasigno{
        public static void main (String[] args){
            Integer a = new Integer(10); //1
            Integer b = new Integer(20); //2
            a = b; //3
            //ahora el objeto Integer(10) es elegible por el GC.
        }
    }
    

    //1 y //2 Creación de los objetos.


    //3 La referencia a y b están ahora apuntando al segundo objeto, siendo el primero elegible para el GC.

  • Cuando la referencia está aíslada:
    Se produce cuando un objeto tiene como miembros otros objetos de su misma clase y aunque se pierdan las referencias de estos objetos aún conservan entre ellos referencias vivas que son elegibles para el GC.

    public class Aislada{
        Aislada vecina;
        public static void main (String[] args){
            Aislada a = new Aislada(); //1
            Aislada b = new Aislada();
    
            a.vecina = b; //2
            b.vecina = c;
            a = null; //3
            b = null; // Aunque las pongamos a null entre los objetos tienen referencias.
        }
     }
    

    //1 y //2: Creación de los objetos Aislada y asignación de la vecina.

       

    //3: Se ponen las referencias a null. Los dos objetos Aisladas son elegibles para el GC.

       

Solicitar la ejecución del GC:
Como hemos dicho antes no se puede forzar la ejecución del recolector de basuras. Se solicita su ejecución mediante la siguiente instrucción pero no se nos garantiza que se ejecute.

Se puede ejecutar mediante:

System.gc();

U obteniendo una instancia de Runtime:

Runtime rt = Runtime.getRuntime();
rt.gc();

Método finalize():
Este método está definido en la clase Object y por tanto todos los objetos lo heredan. En él
podemos escribir cualquier código que queramos que se ejecute antes de que el GC borre el objeto.

Como la ejecución del GC no está garantizada que se ejecute la ejecución de finalize() tampoco está garantizada.

Cada objeto sólo podrá llamar a este método una vez. En este código se podría hacer inelegible el objeto, por ejemplo, volviendo a asignarle una referencia.

Anuncios
 
10 comentarios

Publicado por en 20 octubre, 2011 en Estudio, Tema 3

 

Etiquetas: , , , , , , ,

10 Respuestas a “El recolector de basura

  1. Nendrel

    7 septiembre, 2013 at 4:39 pm

    Hola Virginia,

    Tengo una duda de este código que has puesto:

    public class Aislada{
    Aislada vecina;
    public static void main (String[] args){
    Aislada a = new Aislada(); //1
    Aislada b = new Aislada();

    a.vecina = b; //2
    b.vecina = c;
    a = null; //3
    b = null; // Aunque las pongamos a null entre los objetos tienen referencias.
    }
    }

    Entiendo que, donde has puesto b.vecina = c, querías decir b.vecina = a (la variable c no existe) para que ambos objetos se apunten a cada uno respectivamente.

    Un saludo!

     
  2. Marco Guado

    29 noviembre, 2011 at 9:26 pm

    Hola Virginia dejame felicitarte por la información detallada que apuntas en tu blog y que compartes con toda la comunidad, sabes estoy preparándome para rendir el examen de programador de java y tengo una duda que creo tu me puede ayudar, de antemano agradezco mucho tu ayuda.

    Dado:

    3. class Dozens {
    4. int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12};
    5. }

    6. public class Eggs {
    7. public static void main(String[] args) {
    8. Dozens [] da = new Dozens[3];
    9. da[0] = new Dozens();
    10. Dozens d = new Dozens();
    11. da[1] = d;
    12. d = null;
    13. da[1] = null;
    14. // do stuff
    15. }
    16. }

    Cuántos objetos son elegibles por el garbage collection
    después de la línea 14?

     
    • Virginia Lopez

      30 noviembre, 2011 at 6:00 am

      Hola Marco, muchas gracias por pasarte por aquí.
      He visto el ejercicio que comentas, son dos los objetos que son elegibles para el GC, ya que se pierde acceso a un objeto Dozens, y también al objeto dz que forma parte de él.

      Te dejo un documento donde lo puedes ver mejor:
      Diagrama Dozens

      Un saludo!

       
  3. Virginia Lopez

    7 noviembre, 2011 at 8:14 pm

    De nada, Steve. Cualquier pregunta o duda me ayuda a mí también a aclararme los conceptos.
    Cualquier otra cosilla ya sabes, me la dejas en el blog, o también me puedes mandar un correo a preparandoscjp@gmail.com

    Un saludo!

     
  4. Steve

    7 noviembre, 2011 at 4:03 pm

    Muchas gracias Virginia por tu tiempo, tu diagrama me ha servido mucho, ahora lo entiendo todo.
    Saludos 🙂

     
  5. Steve

    7 noviembre, 2011 at 12:22 pm

    Hola Virginia! antes de todo déjame decirte que tus explicaciones son mas que perfectos 🙂

    Encontré una pregunta sobre Garbage Collector en un simulador del SCJP pero no me dice la respuesta y mucho menos el por que. No se si me podrás ayudar con esta pregunta, te lo agradecería un montón. Esta es la pregunta:

    ¿Cuántos objetos son elegidos por el GC después de la línea 17?

    1. class A{
    2.
    3. A a1;
    4. A a2;
    5.
    6. public void finalize(){
    7. System.out.println(“-“);
    8. }
    9.
    10. public static void main(String args[]){
    11. A s1=new A();
    12. s1.a1=new A();
    13. s1.a2=s1;
    14. s1.a1.a2=new A();
    15. s1.a1.a2.a2=new A();
    16. s1.a1.a2.a2.a1=s1.a1;
    17. s1.a2.a1.a2=null;
    18. System.gc();
    19. }
    20.
    21. }

    Muchísimas gracias! 🙂
    Steve.

     
    • Virginia Lopez

      7 noviembre, 2011 at 3:02 pm

      Hola Steve!

      Lo mejor que se puede hacer siempre es un diagramita en donde tengas el Stack y el Heap. Vas dibujando los elementos donde corresponden y luego te fijas si los objetos son accesibles desde las referencias que tienes en el Stack.

      Según el código el diagrama sería algo así: Diagrama

      Como puedes ver después de la línea 17, en la que se asigna s1.a2.a1.a2 a null, ya no podemos acceder a los dos últimos objetos. Éstos son los que, en mi opinión, son elegibles para el Recolector de basura en este caso.

      Un saludo! Gracias por tu visita!!

       
  6. adnweb.es (@adnwebes)

    20 octubre, 2011 at 4:56 pm

    Con trabajo y dos pequeñajos apenas tengo una horita diaria, pero me lo tomaré con calma… cuando te preparas para el scjp te das cuenta de que muchas cosas las obviamos al programar en Java, el libro me está ayudando a mejorar en el… orden!! 😉
    Espero que te vaya genial y apruebe el examen.

     
  7. adnweb.es (@adnwebes)

    20 octubre, 2011 at 11:03 am

    Qué buenísimos resúmenes haces. Tienes una estupenda capacidad de concreción. Yo me leo el libro por las noches en el sofá y cuando hago el resumen todo me parece poco 😉
    Me está ayudando mucho tu blog, si apruebo también será gracias a ti.
    Un saludo.

     
    • Virginia Lopez

      20 octubre, 2011 at 1:23 pm

      Gracias @adnwebes!! Pues me alegra un montón que te gusten y te sirvan. Ojalá la aprobemos todos y a la primera! ¿Llevas mucho tiempo estudiando? Yo me pongo menos de lo que debería… 🙂

       

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: