Java Islands of isolation (islas de aislamiento)

By | 07/24/2015

Uno de los factores por los cuales el GC (garbage collector) elige los objetos que serán limpiados de memoria es cuando estos no tienen una referencia válida.

Pero existe un caso particular en el que a pesar de tener referencias válidas los objetos pueden ser elegidos por el GC.

Un ejemplo claro de esto es por ejemplo una clase que tiene una variable de instancia que su vez es una referencia a otra instancia de la misma clase.

public class Person {
    Person p;

    public static void main(String [] args) {

        Person p2 = new Person();
        Person p3 = new Person();
        Person p4 = new Person();

        p2.p = p3; // p2 refiere a p3
        p3.p = p4; // p3 refiere a p4
        p4.p = p2; // p4 refiere a p2

        p2 = null; // linea a
        p3 = null; // linea b
        p4 = null; // linea c
  
      // algo mas…

    }

}

Vemos que tenemos tres instancias de personas y en cada una tenemos una variable que refiere a otra instancia diferente de la misma clase persona.

Islandsisolation1

Si hacemos p2 = null , p3 = null , p4 = null quedaría algo así:

Islandsisolation2

Luego de que se ejecuta la “linea c” de nuestro codigo no quedan mas referencias a los objetos p2, p3, p4 sin embargo p2, p3 y p4 todavía tienen internamente referencias a los otros objetos. En teoría esto impediría que GC los limpie.
Cuando el recolector de basura se ejecuta, por lo general puede descubrir dichas islas de objetos y eliminarlos.

Compartir esto:

Deja un comentario

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