2011-11-10 22 views
6

Một điểm đáng tự hỏi trong tâm trí của tôi kể từ vài ngày qua. Tôi muốn biết cách bộ gom rác hoạt động với các lớp tĩnh, các biến?Bộ gom rác và lớp tĩnh, biến số

Như chúng ta đều biết Bộ gom rác theo dõi các đối tượng đã được tạo trong ứng dụng và xóa chúng tự động khi chúng không còn sử dụng nữa. Đối với lớp tĩnh, không có đối tượng nào được tạo và nó được nạp trong bộ nhớ với gỡ rối ứng dụng.

Vì vậy, bộ thu gom rác xử lý các lớp tĩnh?

Trả lời

9

Lớp tĩnh không cần phải bị xóa vì chúng không phải là đối tượng và chúng không tiêu thụ bộ nhớ (ngoài mã lớp thực tế đang được cơ sở hạ tầng .NET tải). Mặt khác, các trường tĩnh trong các lớp tĩnh là các đối tượng tiêu thụ bộ nhớ. Chúng sẽ không được thu thập vì chúng có thể truy cập được trong suốt thời gian tồn tại của ứng dụng. Nếu bạn muốn giải phóng bộ nhớ, bạn nên đặt trường thành null để đối tượng mà trường đã trỏ đến đủ điều kiện cho GC

+0

Được rồi, quan điểm của bạn là bộ gom rác không bao giờ phát hành các trường tĩnh hoặc các biến có nghĩa là chúng luôn được tải trong bộ nhớ. Sau đó, nó sẽ phải nói rằng tĩnh nên được tạo ra chỉ cho const toàn cầu hoặc các biến? –

+3

Có một ngoại lệ: trong .Net 4, bạn có thể có các hội đồng sưu tập. Và nếu một hội đồng là rác thu thập, các trường tĩnh của các loại trong hội đồng này dừng lại là rễ GC, do đó, các đối tượng mà họ tham khảo có thể được thu thập. – svick

+0

@svick khá thú vị cảm ơn bạn. Ngoài ra nó có thể đáng chú ý là các trường trong các lớp tĩnh được instanciated khi lớp được truy cập đầu tiên và không phải khi chương trình được bắt đầu. – Stilgar

1

Anh ấy sẽ không bao giờ giải phóng chúng. (ví dụ: trong WEB cho đến khi khởi động lại IIS).

Họ sẽ không bao giờ nói: "Không ai được tham khảo tôi vì vậy tôi tự do đi"

cũng

bạn không bao giờ có thể làm mới để tĩnh Lớp .... nên tập quán của nó là chỉ đơn thuần là đối tượng Class (không phải là cá thể).

Vì vậy, .net không mất bất kỳ cơ hội nào và giữ nó ra khỏi GC.

+0

cảm ơn vì đã hoàn nguyên royi, tôi có điểm ur –