2009-01-17 35 views
75

Cho một lớp tiện ích giả thuyết rằng chỉ được sử dụng trong thiết lập chương trình:Các trường tĩnh có mở để thu gom rác không?

class MyUtils { 
    private static MyObject myObject = new MyObject(); 
    /*package*/static boolean doStuff(Params... params) { 
     // do stuff with myObject and params... 
    } 
} 

sẽ myObject được thu gom rác thải khi nó không còn được sử dụng, hoặc nó sẽ dính vào xung quanh cho đời sống của chương trình?

Trả lời

93

Biến tĩnh không thể được bầu để thu thập rác trong khi lớp được tải. Chúng có thể được thu thập khi trình nạp lớp tương ứng (chịu trách nhiệm tải lớp này) được thu thập cho rác.

Kiểm tra các JLS Section 12.7 Unloading of Classes and Interfaces

Một lớp học hoặc giao diện có thể được dỡ xuống khi và chỉ khi lớp Định nghĩa của nó bộ nạp có thể thu hồi các bộ thu rác [...] Các lớp và các giao diện nạp bởi bộ tải khởi động có thể không được tải xuống .

+0

Liên kết bị hỏng. – starblue

+0

@bruno, Theo liên kết của bạn, có nghĩa là trình nạp lớp chứa tham chiếu đến mỗi lớp mà nó tải, ngay cả khi lớp được tải không có thành viên tĩnh? – Pacerier

+0

@Pacerier, Có. –

6

Tôi nghĩ rằng this trả lời câu hỏi của bạn - về cơ bản không trừ khi lớp học đến từ trình nạp lớp đặc biệt và loại bỏ lớp.

+2

Hoặc cho đến khi ai đó cập nhật trường tĩnh. –

+0

Thật vậy - nó không được đánh dấu cuối cùng – Tom

42

Biến tĩnh được tham chiếu bởi các đối tượng Lớp được tham chiếu bởi ClassLoaders -so trừ khi ClassLoader loại bỏ Lớp bằng cách nào đó (nếu có thể) hoặc ClassLoader trở thành đủ điều kiện để thu thập (nhiều khả năng - nghĩ đến việc dỡ ứng dụng web) biến tĩnh (hoặc đúng hơn, các đối tượng mà chúng tham chiếu) sẽ không được thu thập.

+1

Các đối tượng 'Lớp' có chứa các biến tĩnh không được tham chiếu bởi trình nạp lớp của chúng? – Pacerier

13

Nếu bạn muốn một đối tượng tạm thời được sử dụng để khởi tạo tĩnh sau đó được xử lý, bạn có thể sử dụng khối khởi tạo tĩnh, ví dụ:

class MyUtils { 
    static 
    { 
     MyObject myObject = new MyObject(); 
     doStuff(myObject, params); 
    } 

    static boolean doStuff(MyObject myObject, Params... params) { 
     // do stuff with myObject and params... 
    } 
} 

vì khối khởi tạo tĩnh là một loại phương pháp tĩnh đặc biệt, myObject là biến cục bộ và có thể được thu thập rác sau khi khối kết thúc thực thi.

+3

Điều này không trả lời câu hỏi ..... – Pacerier

8

myObject là một tài liệu tham khảo và không phải là đối tượng. Một đối tượng được thu thập rác tự động khi không có điểm tham chiếu đến nó vì nó không thể truy cập được.

Vì vậy, cũng là đối tượng đằng sau một tham chiếu tĩnh "myObject" có thể được thu gom rác nếu bạn dereference nó với

myObject = null; 

và không có tài liệu tham khảo khác để đối tượng này.

Tuy nhiên, các tham chiếu và biến tĩnh vẫn tồn tại trong suốt thời gian tồn tại của chương trình của bạn.

+0

Chào mừng bạn đến với StackOverflow! Đặt đối tượng thành 'null' ở cuối' khối tĩnh' là một tùy chọn khả thi. Tuy nhiên, trong trường hợp của tôi, tuổi thọ của vật thể cần dài hơn khối tĩnh. Tính hữu dụng của đối tượng không phải là rất cụ thể; do đó, tôi hỏi về việc sử dụng bộ thu gom rác. –

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