2011-12-13 29 views
10

Nếu một đối tượng không được tham chiếu bởi bất kỳ đối tượng nào khác, thì đối tượng đó phải được thu thập bởi bộ gom rác .NET CLR.Cách thu gom rác thu thập các đối tượng tự tham chiếu?

Tuy nhiên, nếu objA tài liệu tham khảo objB, objB tài liệu tham khảo objC, và tài liệu tham khảo objC trở lại objA, làm thế nào để thu gom rác hình hiện ra rằng họ (như một toàn thể) có thể được thu thập?

+2

.NET sử dụng thuật toán đánh dấu và quét (http://stackoverflow.com/questions/2344240/what-is-relation-between-gc-finalize-and-dispose). –

+0

oh yeah, tìm kiếm nguồn gốc, tôi nên suy nghĩ về điều đó! – athos

+0

Tôi không biết chắc chắn nhưng tôi sẽ giả sử nó sử dụng một số loại cây điều và bất cứ điều gì mà không được kết nối với cây chính không bao giờ có thể được truy cập từ cây chính (mà tôi đang nói mã hiện tại một nơi nào đó trong ngăn xếp). Tôi không biết cụ thể nhưng lý thuyết đồ thị tôi chắc chắn sẽ giải quyết vấn đề. :) – Chris

Trả lời

7

Các CLR sử dụng một kỹ thuật gọi là đánh dấu và quét.

Là một phần của kỹ thuật này, mọi đối tượng đều có thể được coi như được đánh dấu ban đầu để thu thập. Sau đó, CLR đi qua từng đối tượng có thể truy cập, bắt đầu với các hình cầu của bạn (các trường tĩnh, vv) làm gốc và xóa dấu trên mỗi đối tượng có thể đi được. Sau đó quét các đối tượng được đánh dấu còn lại.

Hãy nhớ rằng "đánh dấu" này là khái niệm; trong thực tế, các đối tượng có nhiều khả năng được thêm vào bộ sưu tập.

Trong trường hợp lặp các đối tượng tự tham chiếu, không có tham chiếu đến các đối tượng sẽ được tìm thấy từ ứng dụng và do đó thuật toán sẽ không bao giờ tiếp cận các đối tượng đó để "bỏ đánh dấu" chúng.

2

GC có danh sách tất cả các đối tượng đã tạo. Trong quá trình garbarge nó bắt đầu từ rễ toàn cầu (như các trường tĩnh) và đi qua từng đối tượng được tham chiếu. Mỗi đối tượng từ danh sách tất cả những gì chưa được nhấn có thể bị hủy.

Nếu không có cách nào để đạt objA, objB hoặc ObjC, tất cả các đối tượng này sẽ được thu thập

+1

Không, GC không có danh sách tất cả các đối tượng đã tạo ... – Guffa

+0

@Guffa: Làm cách nào để tìm các đối tượng cần thu thập sau đó nếu nó không có danh sách tất cả các khả năng? Các mô tả đánh dấu và quét chắc chắn ngụ ý rằng nó ... – Chris

+0

Chris: GC không thực sự "đánh dấu" đối tượng; nó là một cấu trúc khái niệm. Trong thực tế, nó là đối tượng mà GC ** có thể ** truy cập được đánh dấu bằng âm. Nói cách khác, hãy nghĩ về một thuộc tính tưởng tượng tồn tại trên tất cả các đối tượng, được gọi là 'mark'. 'mark' là true theo mặc định, do đó GC chỉ cần đánh dấu các đối tượng mà nó ** có thể ** truy cập sai. –

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