2010-01-12 21 views
5

Estaba haciendo esta pregunta en un sitio de preparación de SCJP. ¿Cómo la respuesta A es correcta?recolección de basura de java

¿Qué ocurre con los objetos referenciados por a, b, aa en la línea etiquetada "// algún código va aquí"?

class A { 
    private B b; 
    public A() { 
     this.b = new B(this); 
    } 
} 

class B { 
    private A a; 
    public B(A a) { 
     this.a = a; 
    } 
} 

public class Test { 
    public static void main(String args[]) { 
     A aa = new A(); 
     aa = null; 
     // some code goes here 
    } 
} 


A) The objects referenced by a and b are eligible for garbage collection. 
B) None of these objects are eligible for garbage collection. 
C) Only the object referenced by "a" is eligible for garbage collection. 
D) Only the object referenced by "b" is eligible for garbage collection. 
E) Only the object referenced by "aa" is eligible for garbage collection. 

Respuesta: Un

Respuesta

8

Java no utiliza sólo un simple recolector de basura de recuento de referencias.

Cuando la JVM realiza una ejecución completa de GC, recorre todo el gráfico de objetos, marcando cada elemento que encuentra. Todos los artículos que no están marcados son elegibles para la limpieza.

Dado que ni a ni b ya se puede acceder desde su código principal, no estarán marcados y por lo tanto son elegibles para la limpieza.

2

bueno, para que algo no se pueda coleccionar basura, tiene que ser imposible de alcanzar desde cualquier parte de la pila. Teniendo en cuenta que la pila en ese punto solo tiene un valor nulo para aa y una única matriz de cadenas (args), no hay forma de llegar a a o b.

Cuestiones relacionadas