2010-01-12 53 views
5

Tôi đã trải qua câu hỏi này trên một trang web chuẩn bị SCJP. Câu trả lời A đúng như thế nào?Bộ sưu tập rác java

Điều gì là đúng về các đối tượng được tham chiếu bởi a, b, aa tại dòng có gắn nhãn "// một số mã đi tại đây"?

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. 

Trả lời: Một Java

Trả lời

8

không chỉ sử dụng một tham chiếu đếm thu gom rác đơn giản.

Khi JVM chạy toàn bộ GC, nó chạy toàn bộ biểu đồ đối tượng, đánh dấu từng mục mà nó tìm thấy. Bất kỳ mục nào không được đánh dấu đều đủ điều kiện để dọn dẹp.

Vì không thể truy cập a hoặc b từ mã chính của bạn nữa, chúng sẽ không được đánh dấu và do đó đủ điều kiện để dọn dẹp.

2

tốt, vì một thứ không thể thu gom rác, bạn không thể tiếp cận nó từ bất kỳ đâu trên ngăn xếp. Xem xét rằng ngăn xếp tại thời điểm đó chỉ có một giá trị null cho aa và một mảng chuỗi đơn (args) không có cách nào để đến a hoặc b.