2013-07-11 35 views
7

Trong mục tiêu C, có khả năng hai tham chiếu khác nhau có thể trỏ đến nhau.Hai tham chiếu đối tượng trỏ đến nhau

Nhưng điều này có thể thực hiện được trong Java không? Ý tôi là, hai tham chiếu đối tượng có thể trỏ đến nhau không? Nếu có thể, khi nào thì rác sẽ được thu gom?

Và, trong trường hợp các lớp lồng nhau, hai đối tượng (lớp bên trong và lớp ngoài) được liên kết với nhau - các đối tượng này được thu thập như thế nào?

+2

Tham chiếu đối tượng chỉ có thể trỏ đến một đối tượng. Bạn có ý nghĩa gì bởi hai tham chiếu đối tượng trỏ nhau? –

+0

oh! Tôi mới dùng java! Trong trường hợp các lớp lồng nhau, hai đối tượng (lớp bên trong và lớp bên ngoài) được liên kết với nhau. Nếu tôi có ý nghĩa gì ở đây, làm thế nào hai người này có thể thu gom rác thải –

Trả lời

24

Tôi giả sử bạn đang nói về tham chiếu vòng tròn. GC của Java xem xét các đối tượng "rác" nếu chúng không thể truy cập được thông qua một chuỗi bắt đầu từ gốc GC. Mặc dù các đối tượng có thể trỏ đến nhau để tạo thành một chu kỳ, chúng vẫn đủ điều kiện cho GC nếu bị cắt khỏi gốc.

Có bốn loại rễ GC trong Java:

  1. biến địa phương được giữ sống bởi chồng của một thread. Đây không phải là một tham chiếu ảo đối tượng thực và do đó không hiển thị. Đối với tất cả các ý định và mục đích, các biến cục bộ là các gốc GC.

  2. Chủ đề Java đang hoạt động luôn được coi là đối tượng trực tiếp và do đó là rễ GC. Điều này đặc biệt quan trọng đối với các biến địa phương luồng.

  3. Biến tĩnh được tham chiếu bởi các lớp của chúng. Thực tế này khiến chúng trở thành nguồn gốc GC thực tế. Bản thân các lớp học có thể được thu gom rác, điều này sẽ loại bỏ tất cả các biến tĩnh được tham chiếu. Điều này đặc biệt quan trọng khi chúng ta sử dụng các máy chủ ứng dụng, các thùng chứa OSGi hoặc các trình nạp lớp nói chung.

  4. JNI Tham chiếu là các đối tượng Java mà mã gốc đã tạo như một phần của cuộc gọi JNI. Các đối tượng do đó tạo ra được xử lý đặc biệt bởi vì JVM không biết nếu nó đang được tham chiếu bởi mã gốc hay không. Các đối tượng như vậy đại diện cho một dạng GC đặc biệt.

Bạn cũng có thể đọc here để biết thêm thông tin.

enter image description here

+0

cảm ơn bạn rất nhiều. –

3

Tất nhiên bạn có thể có đối tượng tham chiếu lẫn nhau. Bạn chỉ có thể vượt qua con trỏ this trong cả hai đối tượng với nhau, điều này hoàn toàn hợp lệ.

Tuy nhiên, điều đó không có nghĩa là các đối tượng vẫn có thể truy cập được từ gốc GC. Hãy nghĩ về nó như một cây (đồ thị). Nếu bạn cắt một nhánh hoàn chỉnh khỏi thân cây, toàn bộ nhánh bị mất, cho dù có bao nhiêu đối tượng tham gia hoặc đang duy trì tham chiếu với nhau.

4

Có, bạn có thể thực hiện việc này. Như thế này:

class Pointy { 
    public Pointy other; 
} 

Pointy one = new Pointy(); 
Pointy two = new Pointy(); 
one.other = two; 
two.other = one; 

Chúng là rác được thu thập khi cả hai đối tượng không được chỉ ra bởi bất kỳ thứ gì khác, hoặc các đối tượng khác "không thể truy cập" từ mã đang chạy hiện tại. Các bộ thu gom rác Java là "tracing" garbage collectors, có nghĩa là chúng có thể phát hiện ra loại vấn đề này.

Ngược lại, reference-counted các hệ thống (như Objective C không có bộ sưu tập rác "hiện đại"

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