[Chỉ muốn thêm vào quá trình Hoàn thiện Nội bộ]
Vì vậy, bạn tạo một đối tượng và khi đối tượng được thu thập, Finalize
phương thức của đối tượng sẽ được gọi. Nhưng có nhiều thứ để hoàn thiện hơn giả định rất đơn giản này.
KHÁI NIỆM NGẮN HẠN ::
Đối tượng KHÔNG thực hiện Finalize
các phương thức, có Bộ nhớ được lấy lại ngay lập tức, trừ khi tất nhiên, chúng không thể truy cập được bằng
mã ứng dụng nữa
Objects thực hiện Finalize
Phương pháp, The Concept / Thực hiện Application Roots
, Finalization Queue
, Freacheable Queue
đến trước khi họ có thể được tái sinh.
Bất kỳ đối tượng nào được coi là rác nếu Mã ứng dụng KHÔNG thể truy cập được
Giả :: Lớp học / Objects A, B, D, G, H không thực hiện Finalize
Phương pháp và C, E, F, I, J thực hiện Finalize
phương pháp.
Khi một ứng dụng tạo một đối tượng mới, toán tử mới phân bổ bộ nhớ từ heap. Nếu kiểu của đối tượng chứa một Finalize
phương thức, thì một con trỏ tới đối tượng được đặt trên hàng đợi hoàn thiện .
do đó con trỏ tới các đối tượng C, E, F, I, J được thêm vào hàng đợi hoàn thiện.
Các hàng đợi quyết toán là một cấu trúc dữ liệu nội bộ điều khiển bởi các bộ thu rác. Mỗi mục trong hàng đợi trỏ đến một đối tượng nên có Finalize
phương thức được gọi trước khi bộ nhớ của đối tượng có thể được lấy lại. Hình dưới đây cho thấy một đống chứa một số đối tượng. Một số đối tượng này có thể truy cập từ gốc của ứng dụngvà một số thì không. Khi các đối tượng C, E, F, I và J được tạo, khung .Net phát hiện ra rằng các đối tượng này có Finalize
các phương thức và con trỏ tới các đối tượng này được thêm vào hàng đợi hoàn thiện .
Khi xảy ra GC (Bộ sưu tập thứ 1), các đối tượng B, E, G, H, I và J được xác định là rác. Bởi vì A, C, D, F vẫn có thể truy cập bằng Mã ứng dụng được mô tả thông qua các mũi tên từ Hộp màu vàng ở trên.
Trình thu gom rác quét hàng đợi quyết toán tìm kiếm con trỏ tới các đối tượng này. Khi tìm thấy một con trỏ, con trỏ sẽ bị xóa khỏi hàng đợi hoàn thiện và được thêm vào hàng đợi có thể hiểu được ("F- Reachable ").
Các hàng đợi freachable là một cấu trúc dữ liệu nội bộ điều khiển bởi các bộ thu rác. Mỗi con trỏ trong hàng đợi có thể xác định được xác định một đối tượng đã sẵn sàng để Finalize
gọi phương thức của nó .
Sau bộ sưu tập (Bộ sưu tập thứ 1), heap được quản lý trông giống như hình dưới đây. Giải thích được đưa ra dưới đây ::
1.) Bộ nhớ bị chiếm bởi các đối tượng B, G và H đã được lấy lại ngay lập tức vì các đối tượng này không có phương thức hoàn thiện cần được gọi .
2.) Tuy nhiên, không thể lấy lại bộ nhớ của các đối tượng E, I và J vì Finalize
phương thức của chúng chưa được gọi.
Gọi phương thức Finalize được thực hiện bằng hàng đợi có thể hiểu được.
3.) A, C, D, F vẫn có thể truy cập bằng Mã ứng dụng được mô tả qua các mũi tên từ Hộp màu vàng ở trên, vì vậy chúng sẽ KHÔNG được thu thập trong mọi trường hợp
Có một luồng thời gian chạy đặc biệt dành riêng để gọi các phương thức Finalize. Khi hàng đợi có thể xóa được (thường là trường hợp này), luồng này sẽ ngủ. Nhưng khi các mục xuất hiện, luồng này sẽ đánh thức, xóa từng mục khỏi hàng đợi và gọi phương thức Finalize của từng đối tượng. Các nhà sưu tập rác làm gọn bộ nhớ có thể khai phá và sợi runtime đặc biệt đổ các freachable hàng đợi, thực hiện của từng đối tượng Finalize
phương pháp. Vì vậy, cuối cùng ở đây là khi phương thức Finalize của bạn được thực thi
Lần sau khi trình thu gom rác được gọi (Bộ sưu tập thứ 2), nó sẽ thấy rằng các đối tượng được hoàn thành là rác thực sự, vì các gốc của ứng dụng không trỏ đến nó và hàng đợi có thể xáo trộn không còn trỏ đến nó nữa (do đó cũng là EMPTY) bộ nhớ cho các đối tượng (E, I, J) được lấy lại đơn giản từ Heap. Xem hình bên dưới và so sánh nó với hình ở trên
Điều quan trọng cần hiểu ở đây là hai GC được yêu cầu để lấy lại bộ nhớ được sử dụng bởi các đối tượng yêu cầu hoàn thiện . Trong thực tế, nhiều hơn hai bộ sưu tập taxi thậm chí được yêu cầu vì các đối tượng này có thể được thăng cấp lên thế hệ cũ
LƯU Ý :: Các hàng đợi freachable được coi là một gốc giống như các biến toàn cục và tĩnh là rễ. Do đó, nếu một đối tượng nằm trong hàng đợi có thể hiểu được, thì đối tượng có thể truy cập và không phải là rác.
Lưu ý cuối cùng, hãy nhớ rằng ứng dụng gỡ lỗi là một thứ, Garbage Collection là một thứ khác và hoạt động khác đi. Cho đến nay, bạn không thể CẢM NHẬN bộ sưu tập rác chỉ bằng cách gỡ lỗi các ứng dụng, hơn nữa nếu bạn muốn điều tra Bộ nhớ bắt đầu ở đây.