Nhớ lại bộ sưu tập rác trong Java là gì
Thu gom rác là quá trình lấy lại toàn bộ bộ nhớ thời gian chạy bằng cách hủy các đối tượng không sử dụng.
Đôi khi lập trình viên có thể quên hủy các đối tượng vô dụng và bộ nhớ được cấp cho chúng không được giải phóng. Ngày càng nhiều bộ nhớ hệ thống được sử dụng và cuối cùng không còn được cấp phát nữa. Các ứng dụng như vậy bị "rò rỉ bộ nhớ".
Sau một thời điểm nhất định, không còn đủ bộ nhớ để tạo các đối tượng mới và chương trình kết thúc bất thường do OutOfMemoryError .
![](https://cdn.codegym.cc/images/article/3000851c-d7b0-48c1-a1b0-42fc199942d5/800.jpeg)
Thu gom rác trong Java là quá trình các chương trình Java tự động quản lý bộ nhớ. Các chương trình Java được biên dịch thành mã byte chạy trên Máy ảo Java (JVM).
Khi các chương trình Java chạy trên JVM, các đối tượng được tạo trên heap, là phần bộ nhớ được phân bổ cho chúng.
Trong khi ứng dụng Java đang chạy, các đối tượng mới được tạo trong đó. Cuối cùng, một số đối tượng không còn cần thiết. Chúng ta có thể nói rằng tại bất kỳ thời điểm nào, bộ nhớ heap bao gồm hai loại đối tượng.
- Trực tiếp - Các đối tượng này được sử dụng, chúng được tham chiếu từ một nơi khác.
- Chết - những đối tượng này không được sử dụng ở bất kỳ nơi nào khác, không có tham chiếu đến chúng.
Trình thu gom rác tìm thấy các đối tượng không sử dụng này và loại bỏ chúng để giải phóng bộ nhớ.
Thu gom rác trong Java là một quá trình tự động . Lập trình viên không cần phải đánh dấu rõ ràng các đối tượng sẽ bị xóa.
Mỗi JVM có thể triển khai phiên bản thu gom rác của riêng mình. Tuy nhiên, trình thu thập phải tuân thủ đặc tả JVM tiêu chuẩn để xử lý các đối tượng có trong bộ nhớ heap để đánh dấu hoặc xác định các đối tượng không thể truy cập và hủy chúng thông qua quá trình nén.
Khả năng tiếp cận đối tượng
Để nhận ra một đối tượng còn sống, sự hiện diện của các liên kết là không đủ. Điều này là do một số đối tượng chết có thể tham chiếu đến các đối tượng chết khác. Đó là lý do tại sao điều cần thiết là trong số tất cả các tham chiếu đến một đối tượng, nên có ít nhất một tham chiếu từ một đối tượng "sống".
![Khả năng tiếp cận đối tượng](https://cdn.codegym.cc/images/article/eb12b7bc-7401-440e-a551-9b4461ba3b5d/800.jpeg)
Bộ thu gom rác làm việc với khái niệm GC Roots ( rễ thu gom rác ) để phân biệt giữa vật thể sống và vật thể chết. Có 100% đối tượng trực tiếp và từ chúng có các liên kết tạo hoạt ảnh cho các đối tượng khác, v.v.
Ví dụ về các gốc như vậy:
- Các lớp được tải bởi trình nạp lớp hệ thống.
- Phát sóng trực tiếp.
- Các tham số của các phương thức hiện đang thực thi và các biến cục bộ.
- Các đối tượng được sử dụng làm màn hình để đồng bộ hóa.
- Các đối tượng được giữ lại từ bộ sưu tập rác cho một số mục đích.
- Trình thu gom rác duyệt qua toàn bộ biểu đồ của các đối tượng trong bộ nhớ, bắt đầu từ các gốc này và theo các tham chiếu đến các đối tượng khác.
Các bước thu gom rác trong Java
Việc triển khai thu gom rác tiêu chuẩn có ba bước.
1. Đánh dấu các đối tượng là trực tiếp
Tại thời điểm này, bộ thu gom rác (GC) phải xác định tất cả các đối tượng sống trong bộ nhớ bằng cách duyệt qua biểu đồ đối tượng.
Khi nó truy cập một đối tượng, nó đánh dấu nó là có sẵn và do đó còn sống. Tất cả các đối tượng không thể truy cập được từ gốc GC được coi là ứng cử viên cho việc thu gom rác.
![](https://cdn.codegym.cc/images/article/483e8406-ce8f-458a-8217-c6c2e2c70b2c/800.jpeg)
2. Dọn dẹp vật chết
Sau giai đoạn đánh dấu, không gian bộ nhớ bị chiếm bởi các đối tượng sống (đã truy cập) hoặc đã chết (không được truy cập). Giai đoạn dọn dẹp giải phóng các mảnh bộ nhớ chứa các đối tượng chết này.
![](https://cdn.codegym.cc/images/article/f10e166d-d9bf-462d-9d65-2c81df1b3457/800.jpeg)
3. Sắp xếp gọn các đối tượng còn lại trong bộ nhớ
Các đối tượng chết đã được loại bỏ trong giai đoạn trước không nhất thiết phải ở cạnh nhau. Do đó, bạn có nguy cơ nhận được một không gian bộ nhớ bị phân mảnh (trống một nửa).
Nhưng, tất nhiên, đã cung cấp cho điều này, có thể thu gọn bộ nhớ tại thời điểm bộ thu gom rác loại bỏ các đối tượng chết. Phần còn lại sẽ nằm trong một khối liền kề ở đầu heap.
Quá trình nén giúp dễ dàng phân bổ bộ nhớ tuần tự cho các đối tượng mới.
![](https://cdn.codegym.cc/images/article/7008ce12-e886-44e5-8812-8431b4f7c741/800.jpeg)