2010-01-12 5 views
5

Je passais par cette question sur un site de préparation SCJP. Comment la réponse A est-elle correcte?java garbage collection

Qu'est-ce qui est vrai à propos des objets référencés par a, b, aa sur la ligne intitulée "// du code va ici"?

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. 

Réponse: A

Répondre

8

Java n'utilise pas un simple éboueur de comptage de référence. Lorsque la JVM exécute une exécution complète du GC, elle parcourt l'ensemble du graphe d'objets, en marquant chaque élément qu'elle trouve. Tous les éléments qui ne sont pas marqués sont éligibles pour le nettoyage.

Puisque ni a ni b ne sont plus accessibles à partir de votre code principal, ils ne seront pas marqués et sont donc éligibles pour le nettoyage.

2

Bien, pour que quelque chose ne soit pas collectable, il doit être impossible de l'atteindre de n'importe où sur la pile. Considérant que la pile à ce point a seulement une valeur nulle pour aa et un seul tableau de chaînes (args), il n'y a aucun moyen d'obtenir a ou b.