2013-07-06 35 views
9

Giả sử có một đối tượng thuộc lớp A, chứa tham chiếu đến đối tượng b khác của lớp B. Và đây là tham chiếu duy nhất cho b. Vì vậy, bây giờ, nếu tất cả các tham chiếu đến một được loại bỏ, sau đó một đã sẵn sàng để GC. Điều này có nghĩa là b cũng sẵn sàng để thu gom rác thải không? bởi vì, mặc dù b có một tham chiếu (bên trong a), nó là không thể truy cập được, vì không thể truy cập được.Là một thùng rác đối tượng nếu nó chỉ được tham chiếu từ rác thải?

Vậy kịch bản này hoạt động như thế nào? Ý tôi là thứ tự thu gom rác.

+0

thể trùng lặp của [Garbage Collection trong Java và Thông tư Tài liệu tham khảo] (http://stackoverflow.com/questions/1910194/garbage-collection-in-java-and tham khảo vòng tròn) – delnan

+1

Tốt hơn là nên nghĩ đến bộ thu gom rác để tìm ra những gì ** không phải là ** có khả năng thu gom rác và thu thập phần còn lại. Nếu nó có thể được nhìn thấy từ gốc sau đó nó không thể đọc được –

Trả lời

13

Khi một đối tượng không thể truy cập được từ gốc, nó sẽ được thu thập. Xem this question để có giải thích về rễ GC.

Toàn bộ đồ thị con sẽ được thu thập (như bạn mô tả) giả sử không có nút nào trong biểu đồ con đó có thể đạt được.

Sử dụng Java (và .NET) đánh dấu và quét bộ sưu tập rác liên quan đến loại sự cố này.

Hệ thống dựa trên số lượng tham chiếu (chẳng hạn như C++ 's std::shared_ptr<T>) có thể không thành công trong trường hợp phụ thuộc vòng tròn vẫn không thể truy cập được. Đây không phải là vấn đề đối với Java/.NET GC.

+0

+1 Tôi không thấy bất kỳ lý do gì để bỏ phiếu ở đây. –

+3

Nếu có một downvoter người downvotes không có lý do, sau đó có những người khác như tôi những người upvote cho một câu trả lời tốt :) –

1

Java GC đủ thông minh để thu thập các hòn đảo của các đối tượng bị cô lập mặc dù chúng có thể trỏ đến nhau. Do đó, b cũng trở nên đủ điều kiện để thu gom rác thải. Điểm cần lưu ý ở đây là mặc dù bạn có tham chiếu đến b nhưng không phải là trực tiếp theo nghĩa là không thể truy cập được từ gốc của chương trình.

+1

Điều này tốt hoặc khác tham khảo vòng tròn (A có một tham chiếu đến B và B để A) không bao giờ có thể được thu thập nhưng cũng có thể không truy cập được –

+0

Tại sao bỏ phiếu xuống? –

+0

Có vẻ như somesones đã bỏ phiếu rất nhiều câu trả lời hay trong câu hỏi này. Một số người chỉ là như vậy –

0

Tùy thuộc vào GC. Một JVM có thể được yêu cầu sử dụng các GC khác nhau và thường sử dụng 3 GC là một (eden, copy, markcompact).

Trong bất kỳ GC điển hình nào khi tính lại trường hợp bạn được mô tả được xử lý rõ ràng, cả hai obj đều được thu thập. Hãy suy nghĩ về nó trong 2 giai đoạn: đầu tiên "a" được chú ý và thu thập sau đó "b" được chú ý và thu thập. Một lần nữa: các phương tiện thông báo cụ thể phụ thuộc vào GC.

+0

Đó là kinh nghiệm của tôi mà refcounting thất bại nếu bạn có tài liệu tham khảo vòng tròn.Tức là, nếu A-> B và B-> A, cả hai đều có số đếm, nhưng không thể truy cập được. –

+2

Không có tham chiếu từ "b" đến "a" trong những gì OP được mô tả. –

+0

Đúng, nhưng nếu tôi không nhầm câu trả lời của bạn đã không chú trọng đến điều đó trước khi bạn chỉnh sửa. Ở mức nào, GC là một chủ đề lớn mà OP dường như mới và chúng tôi có thể thoát khỏi các khía cạnh giới thiệu :) –

-1

Đó chính xác là điểm của GC. Vì b là không thể truy cập từ chủ đề chính, nó sẽ được thu gom rác. Nó không chỉ là số lượng quan trọng.

Các vấn đề liên quan