Trong các ngôn ngữ lập trình, một đối tượng có thể chỉ có biến trong quá trình tồn tại của nó, sau khi khởi tạo, nó không thể được sửa đổi. Vì vậy, cùng một ô nhớ không thể được phân bổ cho các giá trị mới, do đó cần một số loại quản lý bộ nhớ tự động để quản lý các không gian không sử dụng. Các không gian không sử dụng này được gọi là rác và toàn bộ quá trình quản lý bộ nhớ hiệu quả được gọi là thu gom rác.
Mục tiêu chính của người thu gom rác là tách các vật thể chết ra khỏi các vật thể sống và lấy lại không gian để tái sử dụng. Về cơ bản, toàn bộ hoạt động trên heap được quản lý, không gì khác ngoài khối bộ nhớ và trình thu gom rác định kỳ kiểm tra bộ nhớ heap để phân bổ bộ nhớ cho các đối tượng mới. Có hai phương pháp để giải phóng các tài nguyên không được quản lý như các tệp và kết nối cơ sở dữ liệu: Loại bỏ và Hoàn thiện.
Bài viết này giúp bạn hiểu sự khác biệt giữa hai.
Vứt bỏ là một cách tiêu chuẩn để người dùng nói với các đối tượng giải phóng tài nguyên của họ và không cố gắng truy cập lại các đối tượng. Phương thức xử lý cung cấp kiểm soát dọn dẹp bộ nhớ rõ ràng bằng cách hiển thị các đối tượng không sử dụng được.
Khi người dùng gọi phương thức Dispose (), đối tượng có nghĩa vụ giải phóng tất cả các tài nguyên đắt tiền của nó do đó làm cho nó có sẵn để sử dụng lại. Nó không bao giờ được gọi bởi trình thu gom rác mà chỉ phát khi bộ nhớ được quản lý trở nên khan hiếm. Một giao diện đặc biệt có tên là ID ID ID dùng một lần được sử dụng để quyết định vị trí và cách triển khai Dispose (). Nhưng điều gì xảy ra khi phương thức xử lý không được gọi?
Nếu phương thức xử lý không được gọi, kế hoạch dự phòng là sử dụng phương thức Finalize () để dọn dẹp. Nó được gọi bởi trình thu gom rác để thực hiện dọn dẹp tài nguyên cuối cùng trước khi giải phóng bộ nhớ. Khái niệm dọn dẹp kịp thời trở nên không thể áp dụng ở đây vì thay vì phân bổ bộ nhớ ngay lập tức, đối tượng được thêm vào hàng đợi hoàn thiện chỉ để bị hủy sau đó. Finalize giống như một biện pháp bảo vệ được đưa ra trong trường hợp xảy ra lỗi lập trình và việc xử lý không làm sạch các tài nguyên trong trường hợp phương thức Finalize () được gọi bởi trình thu gom rác để loại bỏ các đối tượng không thể truy cập theo bất kỳ trình tự nào nó thích.
Phương thức vứt bỏ được gọi để tăng tốc độ giải phóng các tài nguyên không được quản lý như xử lý cơ sở dữ liệu, xử lý tệp, semaphores và các đối tượng khác được phân bổ bởi hệ điều hành. Phương thức xử lý được gọi để thực thi mã cần thiết để dọn sạch bộ nhớ không sử dụng và các tài nguyên khan hiếm như tay cầm GDI. Nói một cách đơn giản, phương thức xử lý cung cấp kiểm soát dọn dẹp bộ nhớ rõ ràng. Mặt khác, phương thức hoàn thiện là một phần của bộ sưu tập rác được sử dụng để thực hiện thao tác dọn dẹp cuối cùng trên một đối tượng trước khi nó được thu gom rác. Nói một cách đơn giản, phương thức hoàn thiện được gọi để giải phóng các tài nguyên không được quản lý bởi một đối tượng trước khi nó bị phá hủy.
Phương thức xử lý có thể được gọi một cách rõ ràng bởi mã người dùng và lớp đang thực hiện phương thức để xử lý tài nguyên. Tuy nhiên, bộ nhớ không thể được giải phóng cho đến khi trình thu gom rác thực hiện quá trình dọn dẹp. Phương thức có thể được gọi ngay cả khi các tham chiếu khác đến đối tượng vẫn tồn tại. Ngược lại, phương thức hoàn thiện chỉ có thể được gọi bởi trình thu gom rác sau khi nó xác định rằng đối tượng bộ nhớ cuối cùng bị hủy và không còn tham chiếu đến đối tượng nữa. Sau khi phương thức hoàn tất được thực thi, đối tượng được xóa khỏi bộ nhớ heap.
Quá trình xử lý một đối tượng khỏi bộ nhớ được gọi là mẫu xử lý, có thể được sử dụng cho các đối tượng truy cập tài nguyên không được quản lý vì trình thu gom rác không thể lấy lại tài nguyên không được quản lý. Giao diện của ID ID có thể sử dụng cùng với một phương thức Vứt bỏ (Boolean) bổ sung được triển khai yêu cầu giải phóng các tài nguyên không được quản lý. Một phương thức hoàn thiện được thực thi khi thể hiện của một đối tượng bị hủy trước khi xử lý. Đó là một phương pháp không xác định xảy ra theo quyết định của người thu gom rác và thậm chí có thể không xảy ra. Nó không nên được thực hiện trên các đối tượng được quản lý cho đến khi cực kỳ cần thiết.
Sử dụng một phương pháp xử lý nhanh hơn nhiều so với hoàn thiện để xử lý các đối tượng ngay lập tức. Các cấu trúc hủy được tự động chuyển đổi để hoàn thiện phương thức trong thời gian chạy. Nó được tự động gọi bởi trình thu gom rác khi đối tượng đi ra khỏi phạm vi, điều này thường xảy ra khi thể hiện của đối tượng đó bị phá hủy. Vấn đề với phương pháp hoàn thiện là nó không có ý nghĩa xác định, không chắc chắn khi nào lấy lại bộ nhớ không còn được tham chiếu qua bộ sưu tập rác. Tuy nhiên, nó có thể không giải phóng bộ nhớ ngay lập tức; trong thực tế, nó có thể không bao giờ được gọi và nó không thể bị ép buộc một cách rõ ràng.
Sự khác biệt chính giữa các phương thức xử lý và hoàn thiện là phương pháp trước là phương pháp xác định loại bỏ ngay lập tức các đối tượng khi chúng không còn được sử dụng, trong khi phương pháp sau là phương pháp không xác định để phân bổ tài nguyên không được quản lý có nghĩa là phương pháp này được giải phóng các đối tượng bộ nhớ khi chúng đi ra khỏi phạm vi trước khi phân bổ. Luôn luôn nên sử dụng phương pháp xử lý hoàn thiện trừ khi cực kỳ cần thiết.
Nói cách khác, hoàn thiện là một biện pháp bảo vệ được đưa ra để dọn sạch các tài nguyên không được quản lý khi phương thức xử lý không thể được gọi trong trường hợp có một số lỗi lập trình. Phương thức hoàn thiện được gọi bởi trình thu gom rác khi một đối tượng sắp bị loại khỏi bộ nhớ heap.