2009-11-30 31 views

Trả lời

11

Phương pháp không phải là rác thu thập được - do đó, điều đó không thực sự rõ ràng ý nghĩa của câu hỏi của bạn.

Tương tự, bạn không bao giờ đặt đối tượng thành không. Bạn có thể đặt giá trị của một biến số null, nhưng điều đó không có gì đối với bất kỳ đối tượng nào mà biến đó đã đề cập trước đó. Nó chỉ có nghĩa là lần sau khi bộ thu gom rác tìm kiếm đối tượng trực tiếp, biến đó sẽ không đóng góp bất kỳ đối tượng nào vào tập hợp các đối tượng phải được giữ sống ở cuối GC.

Tôi khuyên bạn nên đọc Jeffrey Richter's article on garbage collection để biết thêm một chút thông tin cơ bản, sau đó hỏi thêm bất kỳ câu hỏi cụ thể nào khi bạn phải nắm bắt các khái niệm cơ bản.

3

đối tượng không được đánh dấu cho GC, Họ được đánh dấu (bởi sự tồn tại của một biến mà tài liệu tham khảo hoặc điểm đối với họ) để KHÔNG được thu gom rác. Khi mọi biến hoặc tham chiếu đến một đối tượng trong tất cả các luồng đang chạy, và trong tất cả các biến tĩnh toàn cục và trong tất cả các thanh ghi cpu, đã bị xóa, không nằm trong phạm vi hoặc được đặt thành rỗng, thì đối tượng không còn truy cập được nữa và GC sẽ thu thập nó.

4

Nếu bạn hỏi về những gì xảy ra với các đối tượng được tham chiếu bằng các biến trong phương pháp tĩnh, thì các đối tượng đó trở nên dễ hiểu khi thu thập rác khi chúng không còn trong phạm vi.

Nếu bạn đang nói về các đối tượng được tham chiếu bởi trường tĩnh thì các thuật ngữ này sẽ không được thu thập cho đến khi chúng tham chiếu được đặt thành rỗng.

Ví dụ sau đây có thể minh hoạ rõ hơn điều này:

class Example 
{ 
    private static object field1 = new object(); 

    public static void SomeMethod() 
    { 
     object variable1 = new object(); 

     // ... 
    } 

    public static void Deref() 
    { 
     field1 = null; 
    } 
} 

Đối tượng được tham chiếu bởi field1 sẽ được tạo ra khi các lớp được nạp và sẽ vẫn bắt nguồn từ ngay cả khi đối tượng của lớp Ví dụ được tạo ra và bị phá hủy. Cách duy nhất để thu gom rác đối tượng đó là gọi phương thức Deref(), nó sẽ dereference nó bằng cách thiết lập tham chiếu là null. (Trên thực tế, bạn có thể hủy lớp bằng cách tải miền ứng dụng nhưng điều này có phần nâng cao hơn và không phải thứ bạn thường gặp phải thường xuyên.)

Ngược lại, phương thức tĩnh SomeMethod() tạo đối tượng và tham chiếu nó theo biến số biến1. Đối tượng này là dễ hiểu đối với việc thu gom rác ngay sau khi nó nằm ngoài phạm vi (ở cuối phương thức). Về cơ bản, nó có thể được thu thập trước đó nếu phần còn lại của phương pháp không tham chiếu nó.

0

Hãy nghĩ về các phương pháp tĩnh là lớp học phương pháp. Họ có sẵn cho dù một đối tượng tồn tại hay không. Chúng không ảnh hưởng đến việc thu gom rác thải.

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