2010-01-12 20 views
5

Ich ging diese Frage auf einer SCJP-Vorbereitungsseite durch. Wie Antwort A ist richtig?java garbage collection

Was ist wahr an Objekten, auf die mit a, b, aa in der Zeile "// irgendein Code geht hier " verwiesen wird?

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. 

Antwort: Eine

Antwort

8

Java nicht nur einen einfachen Garbage Collector Referenzzählung verwenden.

Wenn die JVM einen vollständigen GC-Lauf ausführt, durchläuft sie das gesamte Objektdiagramm und markiert jedes gefundene Objekt. Alle Elemente, die nicht markiert sind, können bereinigt werden.

Da weder a noch b von Ihrem Hauptcode aus erreichbar sind, werden sie nicht mehr markiert und können daher bereinigt werden.

2

gut, damit etwas nicht Müll sammelbar ist, muss es unmöglich sein, es von irgendwo auf dem Stapel zu erreichen. Wenn man bedenkt, dass der Stack an diesem Punkt nur einen Nullwert für aa und ein einzelnes String-Array (args) hat, gibt es keine Möglichkeit, zu a oder b zu gelangen.