Skip to main content

Java Garbage collection - GC

1. Garbage collection là gì?

Garbage collection là quá trình xác định và loại bỏ các Object không được sử dụng (unreferenced) để giải phóng không gian của Heap để cấp phát cho các đối tượng mới.

Garbage collector là chương trình chạy nền, nó theo dõi toàn bộ các Object trong bộ nhớ (Heap) và tìm ra những Object nào không được dùng nữa (không có Object nảo reference đến nó). Toàn bộ những Object không có reference sẽ bị xóa.

2. Các thành phần của bộ nhớ Heap

Bộ nhớ Heap được chia thành các phần nhỏ như hình dưới đây.

Java-heap.png

- Young Generation Là nơi chứa toàn bộ Object mới được khởi tạo. Khi vùng nhớ Young generation đầy thì garbage collectior là Minor GC hoạt động. Vùng Young generation lại được chia thành 3 vùng nhỏ hơn là Eden và 2 vùng Survivor là S0, S1.

Ban đầu mọi Object mới tạo được chứa ở vùng Eden, khi Eden đầy thì Minor GC chuyển chúng sang vùng S0, S1.

java-heap-eden.png

Minor GC liên tục theo dõi các Object ở S0, S1. Sau "nhiều" chu kỳ quét mà Object vẫn còn được sử dùng thì chúng mới được chuyển sang vùng nhớ Old generation. Old generation được quản lý bởi garbage collectior khác là Major GC.

java-gc-promotion.png

Hình trên mô phòng 2 Object được chuyển từ vùng Young generation sang Old generation sau 9 chu kỳ quét của Minor GC. Những ô màu vàng tượng chưng cho những Object đã không còn được sử dụng (unreferenced). Chúng sẽ được xóa khi Minor GC hay Majo GC clear vùng nhớ nó quản lý.

- Permanent Generation: Mô hình vùng nhớ Heap có vùng Perm (Permanent Generation), Perm không phải một phần của Heap. Perm không chứa Object, nó chứa metadata của JVM như các thư viện Java SE, mô tả các class và các method của ứng dụng.

3. Garbage Collector của Java làm việc như thế nào?

Trong Java, bộ garbage collector làm việc hoàn toàn tự động. Đồng nghĩa với việc lập trình viên không cần gọi các lệnh "dọn" bộ nhớ như trong C/C++.

Phần Implementation của garbage collector nằm trong JVM. Mỗi JVM lại có một cách implement garbage collector khác nhau, phù hợp với những đặc tính của JVM đó (JVM Hotspot vs JRockit...)

Quá trình thu gom rác cơ bản thông qua 3 bước sau:

1. Marking: Là bước đánh dấu những Object còn sử dụng và những Object không còn sử dụng.

gc-marking.png

2. Normal deleting: Trình Garbage Collector sẽ xóa các Object không còn sử dụng.

gc-deleting.png

3. Deletion with Compacting: Sau khi những Object không còn được sử dụng bị xóa, những Object còn được sử dụng sẽ được "gom" lại gần nhau. Điều đó làm tăng hiệu xuất sử dụng bộ nhớ trống để cấp phát cho những Object mới.

gc-compacting.png