java - example - "Isla de aislamiento" de Garbage Collection
garbage collector yugioh (5)
Isla de aislamiento:
- Objeto 1 referencias Objeto 2 y Objeto 2 referencias Objeto 1. Ni Objeto 1 ni Objeto 2 son referenciados por ningún otro objeto. Esa es una isla de aislamiento.
- Básicamente, una isla de aislamiento es un grupo de objetos que se referencian entre sí, pero no están referenciados por ningún objeto activo en la aplicación. Estrictamente hablando, incluso un solo objeto sin referencia es también una isla de aislamiento.
Ejemplo:
public class Test
{
Test i;
public static void main(String[] args)
{
Test t1 = new Test();
Test t2 = new Test();
// Object of t1 gets a copy of t2
t1.i = t2;
// Object of t2 gets a copy of t1
t2.i = t1;
// Till now no object eligible
// for garbage collection
t1 = null;
//now two objects are eligible for
// garbage collection
t2 = null;
// calling garbage collector
System.gc();
}
@Override
protected void finalize() throws Throwable
{
System.out.println("Finalize method called");
}
}
Salida:
- Finalizar el método llamado
- Finalizar el método llamado
Explicación
Antes de destruir un objeto, Garbage Collector llama al método de finalización a lo sumo una vez en ese objeto.
El método de finalización de la razón se llamó dos veces en el ejemplo anterior porque dos objetos son elegibles para la recolección de basura. Esto se debe a que no tenemos ninguna referencia externa a los objetos t1 y t2 después de ejecutar t2 = null.
Todo lo que tenemos es solo referencias internas (que es en la variable de instancia i de clase Test) para ellos el uno del otro. No hay forma de que podamos llamar a la variable de instancia de ambos objetos. Entonces, ninguno de los objetos puede ser llamado nuevamente.
Hasta t2.i = t1: ambos objetos tienen referencias externas t1 y t2.
t1 = null: ambos objetos se pueden alcanzar a través de t2.i y t2, respectivamente.
t2 = null: No hay manera de llegar a ninguno de los objetos.
Ahora, ambos objetos son elegibles para la recolección de basura ya que no hay forma de que podamos llamarlos. :)
¿Podría alguien explicar el concepto de isla de aislamiento de la recolección de basura?
Aquí hay una buena explicación de este término. Extracto:
- "Si un objeto obj1 es basura recolectada, pero otro objeto obj2 contiene una referencia a él, entonces obj2 también es elegible para recolección de basura"
- "Si el objeto obj2 puede acceder al objeto obj1 que es elegible para la recolección de basura, entonces obj2 también es elegible para la recolección de basura"
Esto se llama "isla de aislamiento". Una "isla de aislamiento" describe que uno o más objetos NO tienen referencias de partes activas de una aplicación.
De hecho, si comprende el concepto de Marcar y Barrer de Recolección de basuras, también comprenderá mejor Isla de aislamiento:
- El algoritmo parte de las raíces de la GC: hilo principal, variables locales en el método principal, variables estáticas de la clase principal.
- El algoritmo atraviesa todas las referencias de objeto, comenzando con las raíces de GC, y marca cada objeto encontrado como vivo.
- Toda la memoria del montón que no está ocupada por objetos marcados se recupera. Simplemente se marca como libre, esencialmente barrido sin objetos no utilizados.
- Si dos o más objetos se referencian entre sí, pero no están referenciados por objetos vinculados con ninguna raíz, se encuentran en la isla de aislamiento y también son barridos.
Lo que hay que tener en cuenta es que los objetos solo se recopilan si se hace referencia, directa o indirectamente, desde un objeto raíz de GC (subprocesos, variables locales actuales, variables estáticas, etc.). Si dos (o más) objetos se referencian entre sí, pero no están referenciados desde una raíz, entonces son elegibles para la recolección de basura.
Objeto A hace referencia al objeto B. Objeto B hace referencia al objeto A. Ni el objeto A ni el objeto B son referenciados por ningún otro objeto. Esa es una isla de aislamiento.
Básicamente, una isla de aislamiento es un grupo de objetos que se referencian entre sí, pero no están referenciados por ningún objeto activo en la aplicación. Estrictamente hablando, incluso un solo objeto sin referencia es también una isla de aislamiento.
Editar desde el comentario:
class A {
B myB;
}
class B {
A myA;
}
/* later */
A a = new A();
B b = new B();
a.b = b;
b.a = a;